Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel Route:具有前缀和路由模型绑定的多个路由组_Laravel_Laravel Routing - Fatal编程技术网

Laravel Route:具有前缀和路由模型绑定的多个路由组

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有一条记录 |----------------------------|

你们好,这么好的人

我有一个关于Laravel路线的问题,我无法解决

在User.php模型中,我使用getRouteKeyName函数

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;
    });
});