@hesammousavi
سلام من دسته بندی هارو تو sidebar نمایش دادم و روت هامو تعریف کردم ولی وقتی روی یک دسته بندی کلیک میکنم صفحه ی page not found برام باز میشه
من از ریلیشن many to many استفاده کردم
مدل category:
public function posts()
{
return $this->belongsToMany(Post::class,'post_category');
}
مدل post:
public function categories()
{
return $this->belongsToMany(Category::class,'post_category');
}
view composer
view()->composer('_partials._sidebar',function ($view){
$categories = Category::all();
$categories = $categories->chunk(round($categories->count() /2));
$view->with(compact('categories'));
});
route
Route::get('/category/{category}','SiteController@category')->name('category');
site controller
public function category(Category $category)
{
$posts = $category->posts()->paginate(8);
return view('site.post.index',compact('posts'));
}@hesammousavi
متوجه منظورتون نمیشم
منظورتون از چه مقداری چیست؟
شاید پاسخ شما همینجا باشد
خوب شما داری الان با slug بر میگردونی الان شما که اصلا route model binding مشخص نکردی چرا باید بر اساس کاری که پیش بردید براتون category رو برگردونه !!!!
یعنی استراتژی شما چی بوده این وسط !
چون اگر دقت کنید این روش تعریف روت زمانی جواب میده که id وارد کنید اما در اینجا که میخواید از slug معرفتی کنید باید یک route model binding جداگانه تعریف کنید که از طریق مستندات لاراول میتونید این موضوع رو پیدا کنید
مشکل شما تماما از یک اشتباه سرچشمه میگیره .
الان شما در اینجا بجای slug اگر id قرار بدید راحت اطلاعات برگشت داده میشه . اما با توضیحات که در بالا دادم شما نیاز به این روش دارید
این چیزی که الان شما استفاده کردین بصورت دیفالت تنها از id استفاده میکنه یعنی اگر id دسته بندی رو بزارید بر میگرده .
خوب حالا چیکار میشه کرد که با مقدار مورد نظر برگردونه دو راه بصورت کلی هست یک تغیر مقدار route model binding پیشفرض که اونو از حالت پیش فرض خارج میکنه و همه جا بای با این مقدار از route model binding استفاده کنید .که برای این کار هم باید مقدار زیر رو در مدل مربوطه قرار بدید .
public function getRouteKeyName() {
return 'id';
}
بجای id اسم فیلد قرار میگیره مثلا slug
و روش دوم یعنی Explicit Model Binding
باید در RouteServiceProvider و متد boot کد زیر رو قرار بدید البته با پیش نیاز های خودتون
Route::bind('categorySlug', function($value)
{
return User::where('slug', $value)->firstOrFail();
});
زمانی که این رو تعریف کردید تنها تغییر در بخش زیر اتفاق می افته
Route::get('/category/{categorySlug}','SiteController@category')->name('category');
و مابقی داستان مثل قبله من قطعا روش دومی که گفتم رو پیشنهاد میکنم
@hesammousavi
اگه user بزارم ارور column not found میده که بایدم بده
اگه پست بزارم دوباره صفحه ی page not found میاد
public function boot()
{
//
parent::boot();
Route::bind('categorySlug', function($value)
{
return Post::where('slug', $value)->firstOrFail();
});
}@juza666
صحیح. ممنون از توضیحتون