Php Laravel 5.2中一条路由中的多个路由参数模式
你好, 首先,我真的试着用谷歌搜索这个。但似乎不可能在一个路由中多次使用路由参数模式。我的目标是在路由定义中验证像/resource/{uuid}/subresource/{uuid}这样的路由的参数,而不必在控制器中手动检查这些参数 假设我们有:Php Laravel 5.2中一条路由中的多个路由参数模式,php,laravel,laravel-5,laravel-routing,Php,Laravel,Laravel 5,Laravel Routing,你好, 首先,我真的试着用谷歌搜索这个。但似乎不可能在一个路由中多次使用路由参数模式。我的目标是在路由定义中验证像/resource/{uuid}/subresource/{uuid}这样的路由的参数,而不必在控制器中手动检查这些参数 假设我们有: $router->pattern('uuid','0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'); 适用于以下路线: $router->get('/payment/{uui
$router->pattern('uuid','0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}');
适用于以下路线:
$router->get('/payment/{uuid}','Payments@payment');
$router->get('/users/{uuid}','Users@get');
//等等。。
但是
$router->get('/users/{uuid}/order/{uuid}','Controller@someStuff');
抛出一个错误:
“路由模式”/users/{uuid}/order/{uuid}不能多次引用变量名“uuid”
似乎合法。但我只想验证regex-DRY的论点,而下面这样的其他方法也不起作用:
$router->get('/users/{userId}/order/{orderId}','Controller@someStuff')
->其中(['userId'=>'uuid','orderId'=>'uuid']);
//或
$router->get('/users/{userId:uuid}/order/{orderId:uuid}','Controller@someStuff');
//…反之亦然
唯一有效的方法是:
$router->get('/users/{userId}/order/{orderId}','Controller@someStuff')
->其中(['userId'=>'[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}','orderId'=>'[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}-[0-9a-f]{;
。。。但我真的不想走这条路。事实上这是唯一有效的方法
有人知道一些技巧吗,如何多次应用路由参数模式
谢谢,如果您有任何帮助,我们将不胜感激。Laravel似乎不支持命名路由模式。我以前不得不处理这类事情,我发现这是一种可靠的做事方式: 在
app/Providers
中打开RouterServiceProvider.php
,并将以下内容添加到您的boot()
方法中:
/**
* Define your route model bindings, pattern filters, etc.
*
* @param \Illuminate\Routing\Router $router
* @return void
*/
public function boot(Router $router)
{
$uuidPattern = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}';
$router->pattern('userId', $uuidPattern);
$router->pattern('orderId', $uuidPattern);
$router->pattern('anotherUuid', $uuidPattern); // Just an example - delete this line!
parent::boot($router);
}
基本上,您可以在其中添加所有路由器模式,它们将可用于您的路由。它们都在一个地方,所以如果需要更新它们,很容易记住它们在哪里,并且可以对多个参数重复使用相同的模式。在Laravel 7.x中
您应该在RouteServiceProvider的引导方法中定义这些模式
public function boot() {
$uuidPattern = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}';
Route::pattern('userId', $uuidPattern);
Route::pattern('orderId', $uuidPattern);
parent::boot();
}
上述方法应用于使用该参数名称的所有路由
像这样的路线,
Route::get('/users/{userId}/order/{orderId}', function () {
// Only executed if {userId} and {orderId} accepts given regular expression($uuidPattern)...
});
谢谢你的回复。实际上,我在
Router::boot
方法中有模式定义。是的,这也是一种方式。但假设API有几十个端点,您不想为每个“Id”
定义uuid模式。方法可能类似于将resrouceId
和subresourceId
定义为UUID,但我仍然觉得宇宙中有些东西不好。我可能会打开一个问题/功能请求并让您知道。我认为您是对的,这也让我思考了一下,我打算提交一份PR以允许命名参数模式。我在自己构建的API中遇到了这个问题,该API使用UUID获取大量资源。。我们将看到结论——它不被支持,而且可能永远不会被支持。因此,我接受这是一个解决办法。。。