В PHP маршрутизация klein будет соответствовать как можно большему количеству маршрутов. 2 маршрута, которые я настроил, противоречат друг другу. К ним относятся:regex matching url
$route1: '/websites/[i:websiteId]/users/[i:id]?'
и
$route2: '/websites/[i:websiteId]/users/[a:filename].[json|csv:extension]?'
Это URL я пытаюсь соответствовать, который я думаю, должен соответствовать первому и не второй, является:
/api/v1-test/websites/100/users/4
Регулярное выражение для этих двух:
$regex1: `^/api(?:/(v1|v1-test))/websites(?:/(?P<websiteId>[0-9]++))/users(?:/(?P<id>[0-9]++))?$`
$regex2: `^/api(?:/(v1|v1-test))/websites(?:/(?P<websiteId>[0-9]++))/users(?:/(?P<filename>[0-9A-Za-z]++))(?:\.(?P<extension>json|csv))?$`
Я имею в виду, что это не соответствует, если нет «.csv» или «.json». Проблема в том, что он соответствует обеим маршрутам. Для второго результирующего имени файла будет «4», а расширение будет пустым.
Отправка /api/v1-test/websites/100/users/users.csv работает правильно и соответствует только второму маршруту.
У меня есть только контроль над маршрутом, а не регулярное выражение или совпадение. Спасибо.
я сделал не так много, как это ответ, когда я впервые прочитал. Мое наивное понимание заключается в том, что? говорит, что что-то после этого принимается за параметры. –
Вы правы, что? может использоваться для [маркировки подшаблона] (http://www.php.net/manual/en/regexp.reference.subpatterns.php). Но бывает так, что в синтаксисе регулярного выражения PHP (который использует система маршрутизации Klein) знак вопроса использует более одного использования. Последний ? в вашем маршруте интерпретируется как «0 или 1» [метасимвол] (http://www.php.net/manual/en/regexp.reference.meta.php). – jmeas
Фактически, последний пример маршрута в [Klein readme] (https://github.com/chriso/klein.php#routing) имеет очень похожий путь к тому, что вы описали, явно говоря, что это приводит к расширению файла опций , Если вы хотите, чтобы route2 требовал расширения, вы должны удалить завершающий символ '?'. – jmeas