2016-09-11 1 views
0

J'ai une question assez simple. J'utilise Slim 3 pour construire une API RESTfull.Paramètres optionnels dans l'URL - Slim 3

Comment se fait-ce fonctionne:

$app->get('/news[/{params:.*}]', function ($request, $response, $args) { 
    $params = explode('/', $request->getAttribute('params')); 
    $response->write("news!"); 
    return $response; 

}); 

Mais pas:

$app->get('/news[/{params:.*}]/details', function ($request, $response, $args) { 
$params = explode('/', $request->getAttribute('params')); 
     $response->write("news details"); 
     return $response; 

}); 

En fait ce dernier ne compile pas.

+0

Pouvez-vous ajouter un exemple du chemin que vous souhaitez la route? – Baumi

Répondre

3

L'utilisation de illimitéOptional segments implique que chaque segment conséquent est réservé.

Dans votre itinéraire défini pour /news[/{params:.*}] les chemins suivants remplissent ces conditions:

/news 
/news/foo 
/news/foo/bar 
/news/foo/bar/... 

Ainsi, l'ajout d'un segment fixe supplémentaire /details ne fonctionnera pas si vous ajoutez après les crochets.

Lorsque vous définissez comme /news[/{params:.*}/details] avec le segment /details dans les crochets, il ne fonctionne pas pour les détails, mais pas en combinaison avec la première route & cassera. Vous pouvez toujours aller avec votre premier itinéraire & vérifier le dernier param, ou avec un param facultatif dans:

$app->get('/news[/{params:.*}[/details]]', function ($request, $response, $args) { 

    $params = explode('/', $request->getAttribute('params')); 

    if (end($params) != 'details') { 

     $response->write("news!"); 

    } else { 

     // $params for details; 
     array_pop($params); 

     $response->write("news details"); 
    } 

    // $params is an array of all the optional segments 
    var_dump($params); 

}); 

Mise à jour:

Le problème réel semble ici comme une définition entrant en collision dans les routes, où par exemple, les segments facultatifs illimités correspondent toujours à la seconde route définie. Il peut être résolu en définissant les routes avec une expression régulière d'itinéraire & les enfermant dans un groupe d'itinéraire avant les matchs non entrer en collision:

$app->group('/news', function() { 

    $this->map(['GET'], '', function ($request, $response, $args) { 

     $response->write("news w/o params"); 

    })->setName('news'); 

    // Unlimited optional parameters not ending with "/details" 
    $this->get('/{params:[[:alnum:]\/]*[^\/details]}', function ($request, $response, $args) { 
     $params = explode('/', $request->getAttribute('params')); 

     var_dump($params); 

     $response->write("news!"); 
    }); 

    // Unlimited optional parameters ending with "/details" 
    $this->get('/{params:[[:alnum:]\/]*\/details}', function ($request, $response, $args) { 
     $params = explode('/', $request->getAttribute('params')); 
     array_pop($params); // fix $params 

     var_dump($params); 

     $response->write("news details"); 
    }); 

}); 
+1

J'ai besoin de quelque chose pour faire la différence entre /news[/{params:.*}]/details et /news[/{params:.*}]. Je peux toujours l'écrire sous /news/details[/{params:.*}] mais ça ne sera plus explicite ... –

+0

Je vois, j'ai mis à jour la réponse mais en fait votre première route est conforme pour les deux routes depuis un Le dernier segment "/ details" correspond bien à votre premier itinéraire. –

+0

Avez-vous essayé cela? –