افزودن متد جدید به ریسورس کنترلر به صورت داخلی + Route

روش های ساده ای در اینترنت وجود داره مثل نوشتن یک روت معمولی قبل روت ریسورس و استفاده از آن در همان کنترولر مانند شکل زیر Route::get('tag/details',[TagController::class,'details']); Route::resource('tag',TagController::class);اما در این آموزش میخواهم تغییری در لاراول ایجاد کنیم که با دستور php artisan make:controller ، کنترلر ریسورس ایجاد کنیم که علاوه بر متد هایی که به صورت دیفالت دارد متد جدیدی هم به صورت اتوماتیک برای ما بسازد.در اولین قدم باید با دستور زیر stub های لاراول را جهت تغییر ایجاد کنیم php artisan stub:publishبا زدن این دستور پوشه ای با نام stubs در پروژه لاراول ایجاد خواهد شد . فایلی که می بایست آن را تغییر داد controller.stub است .در این فایل متدی که میخواهید در همه کنترلر های ریسورس وجود داشته باشد را اضافه کنید. مانند زیر //controller.stub <?php namespace {{ namespace }}; use {{ rootNamespace }}Http\Controllers\Controller; use Illuminate\Http\Request; class {{ class }} extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // } /** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { // } /** * Store a newly created resource in storage. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function store(Request $request) { // } /** * Display the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function show($id) { // } /** * Show the form for editing the specified resource. * * @param int $id * @return \Illuminate\Http\Response */ public function edit($id) { // } /** * Update the specified resource in storage. * * @param \Illuminate\Http\Request $request * @param int $id * @return \Illuminate\Http\Response */ public function update(Request $request, $id) { // } /** * Remove the specified resource from storage. * * @param int $id * @return \Illuminate\Http\Response */ public function destroy($id) { // } public function details() { // } }در این فایل من متد details را در انتهای فایل اضافه کرده ام ، تا اینجای کار اگر دستور ارتیسان جهت ایجاد کنترلر ریسورس را وارد کنید متد details نیز برای شما ایجاد خواهد شد اما روت مربوط به این متد هنوز وجود ندارد.برای ایجاد روت این متد داخل دایرکتوری app پوشه ای به نام دلخواد که در اینجا من Routing قرار داده ام ایجاد کنید . فایلی هم با نام دلخواه ایجاد ، (CustomResourceRegistrar) و داخل این فایل از کلاس ResourceRegistrar ارث بری کنید .//CustomResourceRegistrar <?php namespace App\Routing; use Illuminate\Routing\ResourceRegistrar; class CustomResourceRegistrar extends ResourceRegistrar { protected $resourceDefaults = [ 'details', 'index', 'create', 'store', 'show', 'edit', 'update', 'destroy', ]; protected function addResourceDetails($name, $base, $controller, $options) { $uri = $this->getResourceUri($name).'/details'; $action = $this->getResourceAction($name, $controller, 'details', $options); return $this->router->get($uri, $action); } }برای شناسایی متد details میبایست resourceDefaults را باز نویسی کرد .برای ایجاد روت details متد جدیدی همنام با متد اصلی ایجاد میکنیم ادرسی که میخواهید در مرورگر به این متد دسترسی داشته باشید اضافه کرده و کار ما اینجا تمام است . تنها کاری که لازم است ، شناسایی کلاس CustomResourceRegistrar به لاراول است . برای این کار در فایل AppServiceProvider در متد register کد زیر را اضافه کنید.public function register() { $this->app->bind( 'Illuminate\Routing\ResourceRegistrar', // original class 'App\Routing\CustomResourceRegistrar' // Your custom class ); }کار ما تمام شد حالا میتوانید با دستور ارتیسان کنترلر های ریسورسی ایجاد کنید که در همه آن ها متد جدیدی با نام details وجود دارد.php artisan make:controller TagController -r