2016-05-05 12 views
2

Hallo,Mehrere Route Argument Muster in einer Route in Laravel 5.2

für Start, ich habe wirklich versucht, dies zu Google. Es scheint jedoch unmöglich zu sein, ein Routenargumentmuster mehr als einmal in einer Route zu verwenden. Mein Ziel ist eine Argumentvalidierung in der Routendefinition für Routen wie/resource/{uuid}/subresource/{uuid}, ohne diese Argumente manuell im Controller überprüfen zu müssen.

Nehmen wir an, wir haben:

$router->pattern('uuid', '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'); 

funktioniert perfekt für Routen wie

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

ABER

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

wirft einen Fehler:

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

Scheint echt. Aber ich möchte nur Argumente bestätigen durch regex DRY und andere Ansätze wie unten nicht funktionieren:

$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 

Das einzige, was funktioniert, ist dies:

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

... aber ich weiß nicht wirklich Ich möchte diesen Weg gehen. Das ist tatsächlich die einzige Art, wie es funktioniert hat.

Kennt jemand einen Trick, wie man mehrfache Wegargumentmuster anwendet?

Danke, wäre jede Hilfe geschätzt ...

Antwort

0

Laravel nicht genannt Leitwegschemata zu unterstützen scheint. Ich habe vor mit dieser Art der Sache zu tun hatte, und ich habe dies eine zuverlässige Art und Weise, Dinge zu tun sein gefunden:

Öffnen Sie RouterServiceProvider.php in app/Providers und fügen Sie den folgenden Code zu Ihrem boot() Methode:

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

Grundsätzlich können Sie alle Ihre Router-Muster dort hinzufügen und sie werden für Ihre Routen zur Verfügung gestellt. Sie sind alle an einem Ort, sodass Sie sich leicht merken können, wo sie sich befinden, wenn Sie sie aktualisieren müssen, und Sie können das gleiche Muster für mehrere Parameter verwenden.

+0

Vielen Dank für Ihre Antwort. Eigentlich habe ich die Musterdefinition innerhalb der 'Router :: boot'-Methode. Und ja, das ist auch ein Weg. Aber stellen Sie sich vor, dass API Dutzende von Endpunkten haben wird und Sie kein Uuid-Muster für jede " Id" definieren wollen. Der Weg könnte etwas wie die Definition von 'resrouceId' und 'subresourceId' als Uuids sein, aber ich fühle immer noch, dass etwas mit dem Universum nicht stimmt. Ich werde wahrscheinlich eine Frage/Feature-Anfrage öffnen und Sie wissen lassen. – rudolfdobias

+0

Ich denke, du hast Recht, es hat mich auch denken lassen, und ich würde in PR einreichen, um benannte Parametermuster zu erlauben. Ich hatte genau dieses Problem in einer API, die ich gebaut habe, die UUIDs für viele Ressourcen verwendet. – edcs

+1

Eröffnet ein [Problem] (https://github.com/laravel/framework/issues/13442) .. wir werden sehen – rudolfdobias