Laravel 5.2

时间:2016-05-05 00:15:53

标签: 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/{uuid}', 'Payments@payment');
$router->get('/users/{uuid}', 'Users@get');
//etc..

BUT

$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}']);

...但我真的不想通过这种方式。这实际上是唯一有效的方式。

有谁知道一些技巧,如何多次应用路由参数模式?

谢谢,任何帮助都将不胜感激......

2 个答案:

答案 0 :(得分:1)

Laravel似乎不支持命名路由模式。我之前不得不处理这类事情而且我发现这是一种可靠的做事方式:

RouterServiceProvider.php中打开app/Providers并将以下内容添加到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);
}

基本上,您可以在那里添加所有路由器模式,它们将可用于您的路由。它们都在一个地方,因此很容易记住它们应该更新它们的位置,并且可以为多个参数重复使用相同的模式。

答案 1 :(得分:0)

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