تالار گفتمان nCIS.ir

نسخه‌ی کامل: تحلیل یه نمونه روت از پروژه تو گیت
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام
من برای اینکه تسلط بیشتری پیدا بکنم تو لاراول چند تا پروژه رو دارم بررسی میکنم تو یکی از اینها تو روتش اینا رو نوشته:

Route::model('tasks', 'Task');
Route::model('projects', 'Project');

Route::resource('projects', 'ProjectsController');
//Route::resource('tasks', 'TasksController');
Route::resource('projects.tasks', 'TasksController');

Route::bind('tasks', function ($value, $route) {
   return AppTask::whereSlug($value)->first();
});
Route::bind('projects', function ($value, $route) {
   return AppProject::whereSlug($value)->first();
});

نقل قول:By default Laravel will provide an ID value to various resourceful controller methods such as show(), edit(), update() and destroy(). This is fine but it adds alot of extra boilerplate we need to write – grabbing the model instance, checking if it exists etc. Thankfully Laravel provides something called route model binding that helps with this issue. Instead of providing an $id variable, the method will be given the $project or $task object instance instead.

گفته که برای اینکه به جای آی دی از اسم پروژه استفاده کنیم باید از مدل تو روت استفاده کنیم خطهای اول و دوم و قسمت bind رو اصلا متوجه نمیشم به چه دردی میخورن. ممنون میشم یه راهنمایی بکنید
دوست گرامی این همون route model binding هست که تو چند تاپیک قبلی هم سوال فرمودین تو اون متن انگلیسی هم که گزاشتین گفته به جای اینکه بیاییم هربار id رو تو متدهای show , edit, update, destroy دستی دریافت و کوئری بزنیم با این روش خودش تو router براتون به صورت اتوماتیک کوئری میزنه و رکوردو فچ میکنه و گفته فقط کافیه به جای id یک آبجکت از مدل موردنظر به اکشن پاس بدین
تو خطوط آخر هم اومده رفتار کوئری که زده میشه رو تغییر داده و تو url هرجا پارامترهای tasks یا projects اومد به جای ستون id از slug استفاده کنه و مقدار پارامتر رو با این ستون مقایسه کنه
در واقع تو خطوط آخر که رفتار تغییر داده شده من هم مثلا میتونم به جای آی دی بیام name رو قرار بدم و ازش استفاده کنم. الان چیزی که فکر کنم خوب متوجه نشدم این هستش که اینطوری که من رفتار رو دارم تغییر میدم باید برای همه مدلهام این کار رو بکنم تا بتونم از قابلیت model binding استفاده بکنم. به شکلی که تو مثال اومده.
وقتی که رفتار رو تغییر میدم و میزارم روی name مثلا اون طوری وقتی یه ردیف از جدول خونده میشه خود لاراول میاد id که باید پیدا بکنه و بر اساس اون آپدیت و یا حذف بکنه خودش اتومات با این تغییر رفتار ما از id به name بر میداره و استفاده میکنه و ما نیازی نداریم id رو بهش پاس بدیم. درست متوجه شدم؟
نه دیگه نیازی به همه مدل ها نیست فقط همون مدلی که نیاز دارین پارامتر رو بهش bind می کنید

وقتی id رو به ‌name تغییر بدی میره رکوردهایی که name اونها برابر مقدار پارامتری که تو route هست پیدا میکنه
یعنی اگه ما مثلا عبارتی مثل مهدی رو براش ارسال کنیم سرچش بر اساس این هستش پیدا که بکنه یه ردیف از اون جدول رو که برابر اون هستش پیدا میکنه و آپدیت و حذف رو بر اساس آی دی اون انجام میده درسته؟
بله درسته حالا تو کد بالا چون از first استفاده کرده اولین مهدی که پیدا کرد رو به خروجی میبره