2016-09-14 7 views
0

Как я могу «или» на маршруте?Slim 3 - как использовать or-operator в маршруте?

например, /about и /fr/about указывают на те же объекты/классы/методы. Таким образом, вместо:

$app->get('/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

$app->get('/{language:[fr|en]+}/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

Я пытался с этим:

$app->get('/{url:[a-zA-Z0-9\-]+}|/{language:[fr|en]+}/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

Я получаю эту ошибку:

Type: FastRoute\BadRouteException 
Message: Cannot use the same placeholder "url" twice 
File: /var/www/mysite/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php 

Любые идеи, что, как решить эту проблему?

Или любые решения, чтобы избежать , повторяя код?

+0

ошибка исходит из вашего последнего шаблона маршрута, вы ссылаетесь на url дважды ... вам не нужно использовать тот же токен дважды. – geggleto

+0

@geggleto любые решения, чтобы избежать повторения кода? – laukok

+0

Чтобы не дублировать код, вы можете посмотреть http://www.slimframework.com/docs/objects/router.html#container-resolution – danopz

ответ

1

При изменении порядка заполнителей возможно для вас, вы можете реализовать его таким образом:

$app->get('/{url:[a-zA-Z0-9\-]+}[/{language:[en|fr]+}]', function($request, $response, $args) { 
    // code here... 
}); 

Под «изменением порядка заполнителей» Я имею в виду URL приходит первым, то язык, поэтому вместо fr/about вы используете about/fr.

В решении используется Slim's built-in optional segments: обратите внимание на квадратные скобки, которые заключают в заполнитель «язык».

Это, однако, требует, чтобы дополнительные сегменты располагались в конце маршрута, иначе вы получите FastRoute\BadRouteException.

+0

хорошая идея! Благодарю. – laukok

2

Вот почему то, что вы пытаетесь, не работает.

Ваш Routing:

$app->get('/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

$app->get('/{language:[fr|en]+}/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

FastRoute находит первый матч и депеши. Если вы посмотрите на это, ваш первый маршрут соответствует как /about, так и /fr/about Итак, сначала он отправляется ... Фактически, он всегда будет отсылаться первым, всегда.

Вы действительно хотите изменить порядок определений маршрута.

$app->get('/{language:[fr|en]+}/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 
// ADD OTHER ROUTES HERE 

// CATCH ALL 
$app->get('/{url:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 

Чтобы решить проблему дублирования URL ... просто определить другой маркер.

$app->get('/{url:[a-zA-Z0-9\-]+}|/{language:[fr|en]+}/{url2:[a-zA-Z0-9\-]+}', function (Request $request, Response $response, array $args) { 
    // same staff 
}); 
+0

с ''/ {url: [a-zA-Z0-9 \ -] +} |/{language: [fr | en] +}/{url2: [a-zA-Z0-9 \ -] +} ''Я всегда получаю страницу 404. – laukok

+0

Я не эксперт по регулярному выражению ...: D Что именно вы пытаетесь сделать? – geggleto