Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

henryoladj's avatar

Slug Route Return 404

I have stored my slug in my database but i get 404 Not found when i load the url

NewsController.php

<?php

namespace App\Http\Controllers;

use App\News;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

class NewsController extends Controller
{
    function __construct()
    {
        $this->middleware('auth', ['except' => ['index', 'show']]);
    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {

        $news= News::paginate(15);
        return view('categories.news',compact('news'));
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('news.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //validate

        $this->validate($request,[
            'subject'=>'required|min:10',
            'body' => 'required|min:20'

        ]);
        
        auth()->user()->news()->create($request->all());

        //redirect
        $news= News::paginate(15);
        return view('categories.news', compact('news'));
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\News  $news
     * @return \Illuminate\Http\Response
     */
    public function show(News $news, $slug)
    {   

        return view('news.single', compact('news'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\News  $news
     * @return \Illuminate\Http\Response
     */
    public function edit(News $news)
    {
        return view('news.edit', compact('news'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\News  $news
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, News $news)
    {
        if(auth()->user()->id !== $news->user_id){
            abort(401, "Please Login");
        }

        $this->validate($request,[
            'subject'=>'required|min:10',
            'body' => 'required|min:20'
        ]);

        $news->update($request->all());

        return redirect()->route('news.show', $news->id)->withMessage('News Updated');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\News  $news
     * @return \Illuminate\Http\Response
     */
    public function destroy(News $news)
    {   
        if(auth()->user()->id !== $news->user_id){
            abort(401, "Please Login");
        }

        $news->delete();

        $news= News::paginate(15);
        return view('categories.news', compact('news'));
    }
}

The News Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use App\User;
use Illuminate\Support\Str;

class News extends Model
{
    protected $fillable=['subject','body','user_id'];


    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }

    protected static function boot() {
    parent::boot();

    static::creating(function ($news) {
        $news->slug = Str::slug($news->subject);
    });
}

}

Route

Route::get('/news/{slug}', 'NewsController@show')->name('news.show');

I am getting 404 not found if load e.g localhost:8000/news/sample-post

0 likes
2 replies
mariohbrino's avatar

See on the documentation route > routing model binding > Customizing The Key Name.

https://laravel.com/docs/6.0/routing#route-model-binding

Add in your model this method.

public function getRouteKeyName()
{
    return 'slug';
}

Your route needs to follow the pattern.

Route::get('/news/{news}', 'NewsController@show')->name('news.show');

// or to all

Route::resource('/news', 'NewsController');

You don't need the slug in your controller anymore.

public function show(News $news)
{
    return view('news.single', compact('news'));
}
1 like

Please or to participate in this conversation.