Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.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

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
Php Laravel 5.2中一条路由中的多个路由参数模式_Php_Laravel_Laravel 5_Laravel Routing - Fatal编程技术网

Php Laravel 5.2中一条路由中的多个路由参数模式

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

你好,

首先,我真的试着用谷歌搜索这个。但似乎不可能在一个路由中多次使用路由参数模式。我的目标是在路由定义中验证像/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');
//等等。。
但是

$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获取大量资源。。我们将看到结论——它不被支持,而且可能永远不会被支持。因此,我接受这是一个解决办法。。。