`i am having a problem with my show.blade.php template, everything works fine but when I click on a post in the index page it directs me to the /post/1 page without showing the post content only the extended layout. please help
Web.php
Route:: resource('best-practices' ,   'BestpracticesController');
*bestpracticescontroller.php
public function index()
{
        $bestpractices = Bestpractices::all();
        return view('bp.index',compact('bestpractices'));
     }
     public function show(Bestpractices $bestpractices)
     {
        return view('bp.show',compact('bestpractices'));
      }
bp.show view template
@extends('layouts.front')
@section('content')
<div class="blog-details pt-95 pb-100">
    <div class="container">
        <div class="row">
            <div class="col-12">
                <div class="blog-details-info">
                    <div class="blog-meta">
                        <ul>
                        <li>{{$bestpractices->Date}}</li>
                        </ul>
                    </div>
                    <h3>{{$bestpractices->title}} </h3>
                    <img src="{{asset('storage/'.$bestpractices->cover_img)}}" alt="">
                    <div class="blog-feature">
                       {{$bestpractices->body}}
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
Advertisement
Answer
Thats because when you register routes via
Route::resource('best-parctices', BestparcticeController');
//Generated show route is equivalent to 
Route::get(
    '/best-practices/{best_practice}', 
    [BestpracticeController::class, 'show']
);
//route parameter is best_practice
Hence to achieve implicit route model binding the route parameter name must match the parameter name in the controller method
public function show(Bestpractices $bestpractices)
{
    //here $bestpractices will be an int and not an object with 
    //model record as implicit route model binding doesn't work
    return view('bp.show',compact('bestpractices'));
}
public function show(Bestpractices $best_practice)
{
    //here implicit route model binding works so $best_practices is an object 
    //with model record
    return view('bp.show',['bestpractices' => $best_practices]);
}
Or if you don’t want to change the method parameter name in the controller methods then you need to override the route parameter name in the Route:resource() call when you define routes
Route::resource('best-practices',   BestpracticesController::class)
    ->parameters([
        'best-practices' => 'bestpractices'
    ]);
Laravel docs: https://laravel.com/docs/8.x/controllers#restful-naming-resource-route-parameters