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");
});
});
Pouvez-vous ajouter un exemple du chemin que vous souhaitez la route? – Baumi