2016-08-19 3 views
1

Kann RegEx in Silex 2-Routings verwendet werden?Silex 2: RegEx im Routing

brauche ich so etwas wie dies zu tun:

$this->get('/(adios|goodbay)', function (Request $request) use ($app) { 
    return $app['twig']->render('bye.html.twig', []); 
})->bind('bye'); 

Antwort

4

Wie von Thomas gesagt, können Sie ja. Der wichtige Teil der Dokumentation ist route requirements:

In einigen Fällen möchten Sie vielleicht nur bestimmte Ausdrücke übereinstimmen. Sie können Anforderungen mithilfe von regulären Ausdrücken definieren, indem Sie assert für das Controller-Objekt aufrufen, das von den Routingmethoden zurückgegeben wird.

Zum Beispiel:

$app->get('/blog/{postId}/{commentId}', function ($postId, $commentId) { 
    // ... 
}) 
->assert('postId', '\d+') 
->assert('commentId', '\d+'); 

in Ihrem Fall würde also die Definition der Route so etwas wie:

$this->get('/{bye}', function (Request $request) use ($app) { 
    return $app['twig']->render('bye.html.twig', []); 
}) 
->assert('bye', '^(adios|goodbye)$') 
->bind('bye'); 

Wenn Sie auch den Wert des Parameters wissen wollen, Übergeben Sie es einfach an die Steuerung (der Parametername muss mit dem Namen des Parameters in der Routendefinition übereinstimmen):

$this->get('/{bye}', function (Request $request, $bye) use ($app) { 
    if ($bye === 'adios') { 
     $sentence = "eso es todo amigos!"; 
    } 
    else { 
     $sentence = "that's all folks!"; 
    } 

    return $app['twig']->render('bye.html.twig', ["sentence" => $sentence]); 
}) 
->assert('bye', '^(adios|goodbye)$') 
->bind('bye'); 
+1

Und, ist es möglich, aus der Schließung Funktion zu wissen, wenn es aufgerufen wurde mit 'adios' oder 'tschüss'? Danke – cybtow

+0

@cybtow, Ja ist es. Siehe update. – mTorres

+0

Ich hatte überlegt, von Silex zu Symfony zu migrieren (vor allem wegen meines Mangels an Wissen in Silex), aber nach und nach sehe ich Es ist möglich, fast alles zu tun, was Sie leicht mit Symfony machen können. " –

0

die docPage 8 Gegeben:

In Silex definieren Sie eine Route und die Steuerung, die aufgerufen wird, wenn diese Route abgestimmt ist. Ein Routenmuster besteht aus:

  • Muster: Das Routenmuster definiert einen Pfad, der auf eine Ressource zeigt. Das Muster kann variable Teile enthalten und Sie können RegExp-Anforderungen für sie festlegen.

Also ich würde sagen, dass es möglich ist, Regex zu verwenden, wie Sie in der Frage gemacht haben.

+0

Danke! Ich habe versucht mit diesem "/ (adios | goodbay) /" aber es funktioniert nicht, können Sie mir bitte helfen? – cybtow

+0

@cybtow, kannst du mit "es funktioniert nicht" ausarbeiten? Welchen HTTP-Status erhalten Sie eine 404? Haben Sie Silex-Logs überprüft (vorausgesetzt, Sie haben debug aktiviert und monolog, was Sie während der Entwicklung tun sollten)? – mTorres

+0

Dies ist der Fehler NotFoundHttpException in RouterListener.php Zeile 125: Keine Route für "GET/adios" gefunden, wenn ich eine dieser Routen verwende: $ this-> get ('^/(adios | goodbay)/$', $ this-> get ('/^(adios | goodbay) $ /', $ this-> erhalten ('/ (adios | goodbay) /'. Danke – cybtow