从路线Laravel将参数{id}粘贴到控制器中

时间:2019-02-16 08:23:09

标签: php laravel

我有一条路线:

Route::get('/{id?}/{post}', 'PostController@show')->name('postshow');

我可以从控制器粘贴参数{id}吗?

public function showPost($id = null, Post $post)
{
    $id = $post->id;
    return view('post.show', compact('post'));
}

我需要在用户发布时,我需要发布的网址为:http://example.com/12345/post-slug

现在我得到:http://example.com/post-slug

我知道我可以在以下路线中传递ID:route('postshow', [$post->id, $post]); 但是我不能,因为在刀片服务器中我有1000多个这样的记录:route('postshow', $post);并搜索和编辑所有我无法找到的刀片服务器文件。

2 个答案:

答案 0 :(得分:0)

按照您的以下路线:

Route::get('/{id?}/{slug}', 'PostController@show')->name('postshow');

然后在控制器中(不确定我要的是什么,但是根据我对问题的理解:

public function showPost($id = null, $slug)
{
    if($id){
        $post = Post::findOrFail($id);
    }
    else{
        $post = Post::where('slug', $slug)->firstOrFail();
    }

    return view('post.show', compact('post'));
}

在刀片中,如果要生成此url:

route('postshow', [ 'id' => $post->id, , 'slug' => $post->slug]);

答案 1 :(得分:0)

您可以像这样将旧路线重定向到新路线:

Route::get('/{post}', function(Post $post) {
    return redirect($post->id . "/" . $post->slug );
});
Route::get('/{id?}/{post}', 'PostController@show')->name('postshow');

这会将您的http://example.com/post-slug的旧请求重定向到http://example.com/12345/post-slug