2016-05-05 4 views
2

Здравствуйте,Несколько моделей маршрут аргументов в одном маршруте в 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}', '[email protected]'); 
$router->get('/users/{uuid}', '[email protected]'); 
//etc.. 

НО

$router->get('/users/{uuid}/order/{uuid}', '[email protected]'); 

выдает ошибку:

"Route pattern "https://stackoverflow.com/users/{uuid}/order/{uuid}" cannot reference variable name "uuid" more than once." 

Кажется, законно. Но я просто хочу, чтобы проверить аргументы регулярных выражений СУХИХ и другие подходы, как показано ниже не работает слишком:

$router->get('/users/{userId}/order/{orderId}', '[email protected]') 
     ->where(['userId' => 'uuid', 'orderId' => 'uuid']); 
// or 

$router->get('/users/{userId:uuid}/order/{orderId:uuid}', '[email protected]'); 

// ..and vice versa 

Единственное, что работает это:

$router->get('/users/{userId}/order/{orderId}', '[email protected]') 
     ->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}']); 

... но я действительно не Хочешь пройти этот путь. На самом деле это единственный способ.

Кто-нибудь знает какой-то трюк, как применить шаблон аргумента маршрута несколько раз?

Спасибо, любая помощь будет оценена ...

ответ

0

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

В принципе, вы можете добавить все ваши шаблоны маршрутизаторов, и они будут доступны для ваших маршрутов. Они все в одном месте, поэтому легко запомнить, где они находятся, если вам нужно их обновить, и вы можете повторно использовать один и тот же шаблон для нескольких параметров.

+0

Спасибо за ваш ответ. На самом деле, у меня есть определение шаблона в методе «Router :: boot». И да, это тоже. Но представьте, что API будет иметь десятки конечных точек, и вы не хотите определять шаблон uuid для каждого '' Id ". Путь может быть чем-то вроде определения 'resrouceId' и' subresourceId' как uuids, но все же я чувствую, что что-то плохое с вселенной. Вероятно, я открою запрос о проблеме/функции и дам вам знать. – rudolfdobias

+0

Я думаю, что вы правы, мне тоже нужно подумать, и я собирался заглянуть в представление PR, чтобы разрешить именованные шаблоны параметров. У меня была эта точная проблема в API, который я создал, который использует UUID для большого количества ресурсов. – edcs

+1

Открыл [выпуск] (https://github.com/laravel/framework/issues/13442) .. мы увидим – rudolfdobias

Смежные вопросы