رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
تحلیل یه نمونه روت از پروژه تو گیت
#1
سلام
من برای اینکه تسلط بیشتری پیدا بکنم تو لاراول چند تا پروژه رو دارم بررسی میکنم تو یکی از اینها تو روتش اینا رو نوشته:

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 رو اصلا متوجه نمیشم به چه دردی میخورن. ممنون میشم یه راهنمایی بکنید
پاسخ
تشکر شده توسط:
#2
دوست گرامی این همون route model binding هست که تو چند تاپیک قبلی هم سوال فرمودین تو اون متن انگلیسی هم که گزاشتین گفته به جای اینکه بیاییم هربار id رو تو متدهای show , edit, update, destroy دستی دریافت و کوئری بزنیم با این روش خودش تو router براتون به صورت اتوماتیک کوئری میزنه و رکوردو فچ میکنه و گفته فقط کافیه به جای id یک آبجکت از مدل موردنظر به اکشن پاس بدین
تو خطوط آخر هم اومده رفتار کوئری که زده میشه رو تغییر داده و تو url هرجا پارامترهای tasks یا projects اومد به جای ستون id از slug استفاده کنه و مقدار پارامتر رو با این ستون مقایسه کنه
موفقیت، نتیجه تشخیص درست است؛ تشخیص درست، نتیجه تجربه است؛ تجربه نیز اغلب نتیجه تشخیص نادرست است.



پاسخ
تشکر شده توسط: tux-world
#3
در واقع تو خطوط آخر که رفتار تغییر داده شده من هم مثلا میتونم به جای آی دی بیام name رو قرار بدم و ازش استفاده کنم. الان چیزی که فکر کنم خوب متوجه نشدم این هستش که اینطوری که من رفتار رو دارم تغییر میدم باید برای همه مدلهام این کار رو بکنم تا بتونم از قابلیت model binding استفاده بکنم. به شکلی که تو مثال اومده.
وقتی که رفتار رو تغییر میدم و میزارم روی name مثلا اون طوری وقتی یه ردیف از جدول خونده میشه خود لاراول میاد id که باید پیدا بکنه و بر اساس اون آپدیت و یا حذف بکنه خودش اتومات با این تغییر رفتار ما از id به name بر میداره و استفاده میکنه و ما نیازی نداریم id رو بهش پاس بدیم. درست متوجه شدم؟
پاسخ
تشکر شده توسط:
#4
نه دیگه نیازی به همه مدل ها نیست فقط همون مدلی که نیاز دارین پارامتر رو بهش bind می کنید

وقتی id رو به ‌name تغییر بدی میره رکوردهایی که name اونها برابر مقدار پارامتری که تو route هست پیدا میکنه
موفقیت، نتیجه تشخیص درست است؛ تشخیص درست، نتیجه تجربه است؛ تجربه نیز اغلب نتیجه تشخیص نادرست است.



پاسخ
تشکر شده توسط: tux-world
#5
یعنی اگه ما مثلا عبارتی مثل مهدی رو براش ارسال کنیم سرچش بر اساس این هستش پیدا که بکنه یه ردیف از اون جدول رو که برابر اون هستش پیدا میکنه و آپدیت و حذف رو بر اساس آی دی اون انجام میده درسته؟
پاسخ
تشکر شده توسط:
#6
بله درسته حالا تو کد بالا چون از first استفاده کرده اولین مهدی که پیدا کرد رو به خروجی میبره
موفقیت، نتیجه تشخیص درست است؛ تشخیص درست، نتیجه تجربه است؛ تجربه نیز اغلب نتیجه تشخیص نادرست است.



پاسخ
تشکر شده توسط: tux-world




کاربران در حال بازدید این موضوع: 2 مهمان