我的 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);
}
覆盖路由模型绑定
在 RouteServiceProvider
的 boot
方法中添加如下内容。
Route::bind('post', function ($value){
return Post::where('slug', $value)->orWhere('uuid', $value)->firstOrFail();
});
如果您覆盖 RouteServiceProvider
中的路由模型绑定,您仍会使用类型提示。
我做了一个简单的 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);
}
覆盖路由模型绑定
在 RouteServiceProvider
的 boot
方法中添加如下内容。
Route::bind('post', function ($value){
return Post::where('slug', $value)->orWhere('uuid', $value)->firstOrFail();
});
如果您覆盖 RouteServiceProvider
中的路由模型绑定,您仍会使用类型提示。