2017-07-18 6 views
1

Ich möchte folgenden Art der Route.PHP: Schlanke Kombination von optionalen und erforderlichen Param

$app->get('/FetchImages/{catid}[/{subcatid}]/{page}', function ($request, $response, $args) { 
    //Code 
}); 

In Route I folgende wollen:

  • Kategorie - Pflicht
  • Unterkategorie - Optional
  • Seite - Pflicht

Kann ich es in einem Weg zu tun? Wenn ja, wie kann es erreicht werden? Ich möchte eine Funktion für diese Pfade haben:

{catid}/{page} 
{catid}/{subcatid}/{page} 

Antwort

0

Sie können keine obligatorischen Platzhalter nach optional haben. Wenn Sie versuchen, gibt Ihnen fastRoute (Router, von Slim verwendet) einen Fehler.

Und auch wenn wir von Slim und fastRoute abstrahieren, empfehle ich Ihnen, die URL-Struktur Ihrer API zu überdenken. Es ist natürlich, dass obligatorisch zuerst kommt, optional kommt später.

Um gleiche Rückruf für die Strecken zu nutzen, empfehle ich Ihnen page als Abfrage-Parameter übergeben:

$this->get('/FetchImages/{categoryId}[/{subcategoryId}]', function($request, $response, $args) { 

    $categoryId = $args['categoryId']; 
    $subcategoryId = $args['subcategoryId']; 

    // Get requested page value. 
    // It defaults to null if no page specified 
    $page = $request->getQueryParam('page', null); 

}); 

Und senden Anfrage wie folgt aus:

GET http://myapp.com/FetchImages/kittens/dangerous?page=2

In diesem Fall, dass Sie Es ist frei, die Seite zu übergeben oder zu überspringen, und die URL-Struktur ist immer noch ziemlich sauber.

+0

Es ist eine alternative Lösung, denn jetzt funktioniert es. –

0

Sie können zwei Routen mit demselben Rückruf wie folgt erstellen. Es ist keine perfekte Lösung, aber Sie müssen die Seite nicht in einen Abfrageparameter einfügen.

$myCallback = function($request, $response, $args) { 
    $catid = $args['catid']; 
    $subcatid = isset($args['subcatid']) ? $args['subcatid'] : null; 
    $page  = $args['page']; 
    // do other stuff 
}; 

$app->get('/FetchImages/{catid}/{page}', $myCallback); 
$app->get('/FetchImages/{catid}/{subcatid}/{page}', $myCallback); 
+0

Also welche ist die bessere Lösung? Weil ich denke, dass das Senden von Abfrageparam sicher und kein Problem darin ist. Aber ich möchte den richtigen Weg wissen, um diese Aufgabe zu erledigen. –

+0

Ich würde sagen, es gibt beide gut. Aber sie haben ein anderes Ergebnis. Sie können diese Version entweder wählen, wenn Sie als Pfadparameter 'page' haben wollen, oder die andere, wenn Sie eine Seite als Abfrageparameter haben wollen. – jmattheis

Verwandte Themen