کار با Route::resource در لاراول

محمد عسکری
منتشر شده در ۳ ماه پیش | خواندن در ۷ دقیقه

سیستم روتینگ لاراول شامل متد resource هستش که میخواییم توی این مقاله نحوه کار با این متد رو نشون بدیم و بررسی کنیم چه قابلیت هایی داره.

تعریف

Route::resource یه متد RESTful Controller هستش که تمامی موارد پایه ای برای پیاده سازی REST رو روی یک Entity بهمون میده. این متد دوتا ورودی داره، اولین ورودی پیشوند آدرس درخواست های ورودیمون هست و دومی اسم کلاسی که توی اون متد های REST تعریف شدن. با تعریف این متد، ما ۷ اکشن مختلف رو بهشون دسترسی خواهیم داشت. به عنوان مثال اگر ایتم زیر رو تعریف کنیم.

Route::resource('posts','PostController');

برای ساخت یک controller که متد های مورد نیاز رو داشته باشه از دستور زیر می تونیم استفاده کنیم

php artisan make:controller PostController --resource

و حالا اگه نیاز داشته باشیم مدلمون رو مشخص کنیم از دستور زیر استفاده میکنیم

php artisan make:controller PostController --resource --model=Post

خروجی کدمون چیزی شبیه زیر میشه

|        | GET|HEAD  | /posts             | posts.index           | App\Http\Controllers\[email protected]       | |
| | POST | /posts | posts.store | App\Http\Controllers\[email protected] | |
| | GET|HEAD | /posts/create | posts.create | App\Http\Controllers\[email protected] | |
| | GET|HEAD | /posts/{post} | posts.show | App\Http\Controllers\[email protected] | |
| | PUT|PATCH | /posts/{post} | posts.update | App\Http\Controllers\[email protected] | |
| | DELETE | /posts/{post} | posts.destroy | App\Http\Controllers\[email protected] | |
| | GET|HEAD | /posts/{post}/edit | posts.edit | App\Http\Controllers\[email protected] | |


تغییر متد فرم ها

واسه اینکه بتونیم متد فرممون رو به PUT,DELETE یا موارد دیگه تغییر بدیم توی blade لاراول امکانی در نظر گرفته شده که این کار رو برامون راحت میکنه. کد زیر میتونه نمونه ای براتون باشه

@method("PUT")

اگر به کد بالا نگاه کنید ما با استفاده از دستور @method اومدیم متد فرممون رو تغییر دادیم


بخش کردن آدرس های Resource

حالا به عنوان مثال، اگه صرفا دو تا ازین متد ها رو نیاز داشته باشیم میتونیم تعریفمون رو به صورت زیر انجام بدیم 

Route::resource('posts', 'PostController')->only([
'index', 'show'
]);

و یا اگه صرفا دوتا ازین متد ها رو نیاز نداشته باشیم تعریف ما به صورت زیر میشه

Route::resource('posts', 'PostController')->except([    'edit', 'create'
]);


تعریف Resource به صورت تودرتو

بعضی وقتا نیاز داریم این Resource هامون رو به صورت تودرتو تعریف کنیم. به عنوان مثال پست های ما میتونن چندین کامنت داشته باشن. برای تعریف به صورت تو در تو میتونیم از نقطه استفاده کنیم. 

Route::resource('posts.comment','CommentController');

که این کار باعث میشه ادرس هایی شبیه آدرس زیر بوجود بیاد

/posts/{post}/comments/{comment}


تودرتو با طعم فلت 

همونطور که توی تعریف بالا دیدیم، کار ما باعث میشه برای دسترسی به ادرس ها هم به شناسه پست و هم به شناسه کامنت نیاز داشته باشیم. در صورتی که شناسه دوم ما (کامنت) مطمئن باشیم یکتا هست، می تونیم از Shallow استفاده کنیم. 

Route::resource('posts.comment','CommentController')->shallow();

کار ما باعث میشه جدولی به صورت زیر داشته باشیم

|        | PUT|PATCH | comments/{comment}                 | comments.update              | App\Http\Controllers\[email protected]            ||
| | GET|HEAD | comments/{comment} | comments.show | App\Http\Controllers\[email protected] ||
| | DELETE | comments/{comment} | comments.destroy | App\Http\Controllers\[email protected] ||
| | GET|HEAD | comments/{comment}/edit | comments.edit | App\Http\Controllers\[email protected] ||
| | POST | posts/{post}/comments | posts.comments.store | App\Http\Controllers\[email protected] ||
| | GET|HEAD | posts/{post}/comments | posts.comments.index | App\Http\Controllers\[email protected] ||
| | GET|HEAD | posts/{post}/comments/create | posts.comments.create | App\Http\Controllers\[email protected] ||


نام گذاری آدرس ها

در حالت عادی تمامی متد های کنترلر اسم Route رو روی خودشون دارن. شما میتونید با ارسال متد names این اسامی رو تغییر بدید

Route::resource('posts', 'PostController')->names([
'create' => 'posts.build'
]);


نامگذاری پارامتر ها

در حالت عادی پارامتر های ارسالی به ادرس ها، اسم مفرد شده آدرس رو میگیرن. به عنوان مثال اگه posts اسم ادرس باشه، اسم پارامتر میشه post. حالا اگه شما نیاز داشته باشید این رو تغییر بدید میتونید به صورت زیر عمل کنید

Route::resource('posts', 'AdminPostController')->parameters([
'posts' => 'admin_post'
]);

این کار باعث میشه آدرس های شما به صورت زیر در بیاد

/posts/{admin_post}


تکمیل تر کردن Route ها

در صورتی که شما نیاز داشته باشید Route‌ی غیر از route های resource داشته باشید باید تعریف اون رو الزاما قبل از resource انجام بدید. 

Route::get('posts/popular', '[email protected]');
Route::resource('posts', 'PostController');
حواستون باشه که کنترلر هاتون رو متمرکز نگه دارید. اگر نیاز داشتید Routeی مجزا تعریف کنید، بهتره controller اون هم جدا کنید تا Controller های کوچکتر و متمرکزتری داشته باشید


ممنون از شما، اگر سوالی بود بپرسید


محمد عسکری

نظرات