我的 Post 模型怎么会有 2 个不同的路由键名称? (Laravel)

How could I have 2 different route keys names for my Post model? (Laravel)

我做了一个简单的 Laravel CRUD,但遇到了一个问题。
我的 post 在存储它们的 table 中有一个 slug 列和一个 uuid 列。我已经使用

将路由绑定到 PostController
Route::resource("posts", "PostController");

我希望能够使用 URL 中的 slug 调用 show 路由,(example.com/posts/all-about-my-new-banana-maker),但能够调用 edit 使用 UUID 路由 (example.com/posts/ddd83f7b-9c73-11eb-93c2-e55e28ace783/edit)
我试过编辑我的 Post 模型并更改 getRouteKeyName:

class Post extends Model
{
    use HasFactory;

    // Set mass-assignable fields
    protected $fillable = ["title", "content", "category", "image", "slug", "uuid"];

    /**
     * Get the route keyfor the model
     * @return string
     */
    public function getRouteKeyName() {
        return "slug";
    }
}

我只能看到有 UUID 或 slug,不能同时看到。我怎样才能让 UUID 和 slug 检索我的 post?

如果你想传递额外的 route parameter,那么你需要为此定义另一条路线:

Route::get("posts/{uuid}/{slug}", "PostController@data");

你的控制器看起来像:

public function data($uuid, $slug) {
    // You can access $uuid and $slug here
}

您可以从您的方法中删除任何类型提示,或者覆盖您 RouteServiceProvider 中的路由模型绑定。

删除类型提示

public function show($post)
{
    $post = Post::where('slug', $post)->firstOrFail();
}

public function edit($post)
{
    $post = Post::where('uuid', $post);
}

覆盖路由模型绑定

RouteServiceProviderboot 方法中添加如下内容。

Route::bind('post', function ($value){
    return Post::where('slug', $value)->orWhere('uuid', $value)->firstOrFail();
});

如果您覆盖 RouteServiceProvider 中的路由模型绑定,您仍会使用类型提示。