Laravel 5.2 中一个路由中的多个路由参数模式
Multiple route argument patterns in one route in Laravel 5.2
你好,
首先,我真的尝试了 google 这个。但是似乎不可能在一个路由中多次使用路由参数模式。我的目标是在路由定义中对 /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/{uuid}', 'Payments@payment');
$router->get('/users/{uuid}', 'Users@get');
//etc..
但是
$router->get('/users/{uuid}/order/{uuid}', 'Controller@someStuff');
抛出错误:
"Route pattern "/users/{uuid}/order/{uuid}" cannot reference variable name "uuid" more than once."
似乎是合法的。但我只想通过正则表达式 DRY 验证参数,下面的其他方法也不起作用:
$router->get('/users/{userId}/order/{orderId}', 'Controller@someStuff')
->where(['userId' => 'uuid', 'orderId' => 'uuid']);
// or
$router->get('/users/{userId:uuid}/order/{orderId:uuid}', 'Controller@someStuff');
// ..and vice versa
唯一有效的是:
$router->get('/users/{userId}/order/{orderId}', 'Controller@someStuff')
->where(['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}']);
...但我真的不想走这条路。这实际上是它工作的唯一方式。
有谁知道一些技巧,如何多次应用路由参数模式?
谢谢,如有任何帮助,我们将不胜感激...
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);
}
基本上,您可以在其中添加所有路由器模式,它们将可用于您的路由。它们都在一个地方,因此如果您需要更新它们,很容易记住它们的位置,并且您可以为多个参数重复使用相同的模式。
在Laravel7.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)...
});
你好,
首先,我真的尝试了 google 这个。但是似乎不可能在一个路由中多次使用路由参数模式。我的目标是在路由定义中对 /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/{uuid}', 'Payments@payment');
$router->get('/users/{uuid}', 'Users@get');
//etc..
但是
$router->get('/users/{uuid}/order/{uuid}', 'Controller@someStuff');
抛出错误:
"Route pattern "/users/{uuid}/order/{uuid}" cannot reference variable name "uuid" more than once."
似乎是合法的。但我只想通过正则表达式 DRY 验证参数,下面的其他方法也不起作用:
$router->get('/users/{userId}/order/{orderId}', 'Controller@someStuff')
->where(['userId' => 'uuid', 'orderId' => 'uuid']);
// or
$router->get('/users/{userId:uuid}/order/{orderId:uuid}', 'Controller@someStuff');
// ..and vice versa
唯一有效的是:
$router->get('/users/{userId}/order/{orderId}', 'Controller@someStuff')
->where(['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}']);
...但我真的不想走这条路。这实际上是它工作的唯一方式。
有谁知道一些技巧,如何多次应用路由参数模式?
谢谢,如有任何帮助,我们将不胜感激...
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);
}
基本上,您可以在其中添加所有路由器模式,它们将可用于您的路由。它们都在一个地方,因此如果您需要更新它们,很容易记住它们的位置,并且您可以为多个参数重复使用相同的模式。
在Laravel7.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)...
});