Laravel Route:具有前缀和路由模型绑定的多个路由组
你们好,这么好的人 我有一个关于Laravel路线的问题,我无法解决 在User.php模型中,我使用getRouteKeyName函数Laravel Route:具有前缀和路由模型绑定的多个路由组,laravel,laravel-routing,Laravel,Laravel Routing,你们好,这么好的人 我有一个关于Laravel路线的问题,我无法解决 在User.php模型中,我使用getRouteKeyName函数 public function getRouteKeyName() { return 'user_name'; } 在Post.php模型中也是如此 public function getRouteKeyName() { return 'uuid'; } 在用户表中,1有一条记录 |----------------------------|
public function getRouteKeyName()
{
return 'user_name';
}
在Post.php模型中也是如此
public function getRouteKeyName()
{
return 'uuid';
}
在用户表中,1有一条记录
|----------------------------|
| id | ... | user_name | ... |
| 1 |-----| @simple |-----|
在posts表中
|------------------------------------|
| id | ... | uuid | ... |
| 1 |-----| abcd-123-efg-456 |-----|
In-route web.php
// for post (key: uuid)
Route::group(['prefix' => '{post}'], function () {
Route::get('/', function (Post $post) {
return $post;
});
});
// for users (key: user_name)
Route::group(['prefix' => '{user}'], function () {
Route::get('/', function (User $user) {
return $user;
});
});
然后假设我们访问url:
在debugbar中,我看到查询:
从uuid='@simple'限制1的帖子中选择*
我试过的
[1] 我将where子句放在POST和用户的路由组中
让我们再次访问url:
我得到了什么,404
[2] 我删除了User和post模型中的getRouteKeyname
重新访问url:,仍然得到404
[3] 我试图将路由模型绑定列的名称
不过,查询结果是一样的:>select*from posts,其中uuid='@simple'限制为1
我想要达到的目标
假设我们访问url:
获取用户名为@simple的用户,如果该用户不存在,则返回404
对于帖子也是如此
我们访问网址:
获取uuid为abcd-1234-efgh-5678或404的帖子(如果不存在)
问题:
[1] 如何告诉Laravel Route:我有两个具有不同模型绑定的路由组?对不起,如果这个问题有点混乱,因为我的英语不是很好
[2] 我是否在Laravel中实现了路由组和路由模型绑定的最佳实践
提前谢谢 你打算得到什么结果? 如果您正在做我认为您正在做的事情,试图查看文章中的内容,那么您需要返回类似$post->content replace content的内容,并使用您想要获得的列,您甚至可能希望创建一个视图并使输出更好,并使用一个控制器进行更多处理 至于路由模型绑定,您可以参考,使用table:column和使用getRouteKeyName这两种方法都可以,但是,第一种方法不会更改默认列,如果您对另一个路由使用{user},它仍然会使用ID列,但是,如果您对另一个路由使用{user},第二种方法会更改默认值,它将使用您指定的列 此外,您应该使用类似user/{user:user\u name}和post/{post:uuid}的内容,而不是像您所说的那样,仅使用{user:username}和{post:uuid},因为它不知道您使用的是哪条路由。uri必须是不同的 路由将按照您放置它们的顺序进行计算,这意味着带有{post:uuid}的第二个路由将使用{user:username}覆盖路由,因为它们具有相同类型的uri,也就是说,它们都由1个通配符组成,没有其他内容。要解决此问题,只需通过添加静态部分使其uri不同,例如,添加post/before{post:uuid}和/或添加user/before{user:user_name},如下例所示:
Route::group([
'prefix' => 'post/{post:uuid}',
], function () {
Route::get('/', function (Post $post) {
return $post;
});
});
Route::group([
'prefix' => 'user/{user:user_name}',
], function () {
Route::get('/', function (User $user) {
return $user;
});
});
非常清楚地说,您的两条路由具有相同的uri,即1个通配符,而没有其他内容,因此,使用此uri显示的最后一条路由将覆盖具有相同uri的所有先前路由。这意味着在此之前具有相同uri的所有先前路由都将被视为不存在,并且当您转到uri格式为/[insert somethine here]的路径时,它符合具有1个通配符的格式,并且只会转到您指定的最后一个路由,即用于POST的路由
由于用户的路由在POST的路由之前声明,并且它们共享相同的uri,因此将只使用POST的路由。即使在您试图查找用户时,它仍然使用发送路线,如果不存在uuid与您提供的用户名相同的发送,则即使确实存在具有该用户名的用户,它仍将返回错误
此外,如果只有一条路由,则不需要路由组,但如果将来要向组中添加更多路由,则更易于阅读和使用。据我所知,您需要进行以下更改,这些更改将起作用, routes/web.php
Route::group([
'prefix' => 'post/{post:uuid}'
], function () {
Route::get('/', function (Post $post) {
return $post;
});
});
Route::group([
'prefix' => 'user/{user:user_name}'
], function () {
Route::get('/', function (User $user) {
return $user;
});
});
上面使用的正则表达式只是过滤{argument}并检查{argument}是否基本上是字母数字,在以上两种情况下,它的工作原理相同,除了用户名之外,它还允许“-”,您好,我使用2个路由组,一个用于post,另一个是user,所以每当我访问URL时,像这样:…/@user\u name,它会获取一个用户,并且,当我访问这样的URl时:…/abcd-1234-efgh-5678,它获取了一篇帖子,我知道我可以使用控制器,它只是简化了我想说的内容,实际代码使用控制器我很抱歉,我不太明白现在有什么不起作用Idk,如果你正在简化路由的路径或什么,但是{user:user\u name}前面的部分和前面的部分{post:uuid}不能相同。Route::group['prefix'=>'post/{post:uuid}',],函数{Route::get'/',函数post$post{return$post;};};Route::group['prefix'=>'user/{user:user_name}',],函数{Route::get'/',函数user$user{ 返回$user;};};这样就行了。模式必须不同,否则它将不知道您使用的是哪条路线
Route::group([
'prefix' => 'post/{post:uuid}',
], function () {
Route::get('/', function (Post $post) {
return $post;
});
});
Route::group([
'prefix' => 'user/{user:user_name}',
], function () {
Route::get('/', function (User $user) {
return $user;
});
});
Route::group([
'prefix' => 'post/{post:uuid}'
], function () {
Route::get('/', function (Post $post) {
return $post;
});
});
Route::group([
'prefix' => 'user/{user:user_name}'
], function () {
Route::get('/', function (User $user) {
return $user;
});
});