Я пытаюсь направить URL-адрес в Symfony, URL для сопоставления имеет 3 варианта
/test/param1/test.json
/test/param1/param2/test.json
/test/param1/param2/param3/test.json
Я хочу сделать это с одним контроллером, а param2 и param3 являются необязательными параметрами.
Я пробовал регулярное выражение в требования param2 и param3, чтобы разрешить строку и ничего, но я не могу заставить все 3 пути соответствовать одному и тому же контроллеру.
Спасибо
Вы можете использовать только один параметр маршрута, который разрешает «/», а затем разделить параметры в контроллере. Что-то вроде этого :
_test:
path: /test/{params}/test.json
defaults: { _controller: AppBundle:Demo:test }
requirements:
params: .+
И контроллер:
public function testAction(Request $request, $params)
{
dump($params); // param1/param2/param3
$paramsArray = split("/", $params);
}
Это может работать для любого количества параметров!
Что вы можете сделать, это определить разные маршруты и назначить их одному контроллеру:
testparam123:
pattern: /test/{param1}/{param2}/{param3}/test.json
defaults: { _controller: Bundle:Controller:test}
testparam12:
pattern: /test/{param1}/{param2}/test.json
defaults: { _controller: Bundle:Controller:test}
testparam1:
pattern: /test/{param1}/test.json
defaults: { _controller: Bundle:Controller:test}
Тогда метод действия вашего контроллера выглядит примерно так
public function testAction($param1,$param2=NULL,$param3=NULL) {
// do something
}
надеюсь, это поможет
Это не будет работать с одной конфигурацией маршрута. Если параметры должны быть необязательными, то вы должны оставить параметр запроса пустым, как
/test/param1/param2//test.json
Здесь Symfony знает, что param3 пуст. В противном случае вы никогда не узнаете, какая часть URL пуста, потому что вы можете сделать это:
/test/param1/param3/test.json
Как Symfony распознает, что param2 отсутствует, а вместо него задан param3?
Вы можете изменить логику из
/test/param1/param2/param3/test.json
в
/test/param1-param2-param3-test.json
Это намного проще в обращении.