多引數路由中巧妙利用自定義鍵名實現需求

聖堂刺客發表於2020-02-28

半夜翻著社群的wiki文件,看到路由那一部分,看到自定義鍵名是我以前從來沒注意到的,然後我就立馬坐起來開虛擬機器了。
因為我還惦記著很早之前在社群就發過的一個問答帖子 路由繫結兩個引數,有更好的寫法麼?

當時我的需求很簡單,就是想讓文章的連結顯示成 domain/{category_slug}/{post_id} 這種形式,即文章分類別名/文章id,自己用的WordPress部落格也是這種固定連結,只能說習慣了吧。

當時,我自己的寫法是

//路由
Route::get('{category}/{post}','PostsController@show')->name('post.show');

//控制器
public function show($categorySlug,$postId)
{
    $post = Post::find($postId);
    if(! empty($post) && $categorySlug == $post->category->slug){
    return view('post.show',compact('post'));
    }else{
    return '404';
    }
}

雖然這程式碼看起來一點都沒利用到laravel的特性,但也算基本實現了我的需求。然而今天就不一樣了,今天我讀文件發現了一個用法,可以解決我這個需求,而且看起來也比之前的方法簡潔一些。

自定義鍵名,自然是要用在Category模型上,因為我的需求是用Category的slug,而不是id。

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

路由的寫法,可以放心寫上{category}而不用擔心被認為是category_id了

//路由
Route::get('{category}/{post}','PostsController@show')->name('post.show');

//控制器
public function show(Category $category,Post $post)
{
    return view('posts.show', compact('category','post'));
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章