0

我有一条通过 slug 获取单个帖子项目的路线。

路线

Route::get('post/{post}', 'PostController@details')->name('post.details');

虽然我想在路由的控制器方法中传递模型。

控制器

public function details(Post $post)
{
    // how to get the post by slug
}

我的问题是如何通过 slug 传递路线而不是帖子 ID 来获取帖子?

我知道我可以通过 slug 并使用 where 子句获取帖子。

//Route
Route::get('post/{slug}', 'PostController@details')->name('post.details');

//Controller method
public function details($slug)
{
    $post = Post::with('slug', $slug)->first();
}

但我想通过在方法中传递模型来学习做同样的事情。

4

2 回答 2

1

将路由键名称设置为您的模型类

//Post.php
public function getRouteKeyName()
{
    return 'slug';
}

这将通知 Laravel 注入器/解析器在slug获取对象实例时查看在列中传递的变量。

于 2020-01-09T07:26:07.917 回答
1

您要做的是隐式路由模型绑定

您可以做的是在您的 Post 模型中定义getRouteKeyName如下

<?php

class Post extends Model
{
    /**
     * Get the route key for the model.
     *
     * @return string
     */
    public function getRouteKeyName()
    {
        return 'slug';
    }
}

并像这样定义您的路线:

Route::get('post/{post:slug}', 'PostController@details')->name('post.details');

然后在你的控制器中

public function details(Post $post)
{
    // it will return post with slug name
    return $post;
}

希望能帮助到你。

谢谢

于 2020-01-09T07:48:02.630 回答