В symfony2 routing.yml я пытаюсь создать маршрут с дополнительными параметрами, такими как это:
/app/type/{typeValue}/page/{page}
Итак, пример, который будет работать:
/app/test/type/hello/page/1
Мой маршрут:
api_test:
pattern: /api/test/type/{typeValue}/page/{page}
defaults: { _controller: TestCoreBundle:Json:test, page:1 }
Это нормально, но я хочу, чтобы / type / {typeValue} и / page / {page} были необязательными, так что это работает и для URL, как это:
/app/test
/app/test/page/3
/app/test/type/myType
Мои другие маршруты также будут содержать более сложные необязательные параметры, поэтому для меня важно решить эту проблему. Что мне нужно сделать, чтобы мне не нужно было создавать отдельные маршруты, чтобы он поддерживал каждую комбинацию?
Как объяснено на страница Symfony все после необязательного заполнителя тоже должно быть необязательным.
Конечно, вы можете иметь более одного необязательного заполнителя (например,
/blog/{slug}/{page}
), но все после дополнительного заполнителя
должен быть необязательным. Например,/{page}/blog
допустимый путь, но страница
всегда будет требоваться (т.е. просто/blog
не будет соответствовать этому маршруту).
В твоем случае {typeValue}
необязательно, но следует /page/
что не является обязательным, поэтому этот маршрут никогда не будет работать с обоими параметрами необязательно.
Вы можете использовать строки запроса или изменить свой маршрут на что-то вроде
api_test:
pattern: /api/test/{typeValue}/{page}
defaults: { _controller: TestCoreBundle:Json:test, typeValue: 'default', page: 1 }
requirements:
page: \d+
После этого вы сможете использовать маршруты
/app/test
/app/test/myType
/app/test/myType/3
Но даже тогда маршрут /app/test/3
не возможно, так как Symfony будет интерпретировать это как $typeValue = 3
а также $page
по умолчанию.
Параметры динамической маршрутизации по-прежнему необходимо заполнять или задавать по умолчанию, я бы рекомендовал передать их в качестве параметров, а затем добавить к строке запроса, например? Page = 1&myType = blah и используйте $ request-> get () в вашем контроллере, базовый класс.