Согласно документации Symfony , маршрут, определенный ниже, должен запускать указанный контроллер для обоих /hello/bob
и /hello/bob/bobby
:
_hello:
path: /hello/{names}
defaults: { _controller: \Drupal\mymodule\Controller\Main::Controller }
requirements:
_access: 'TRUE'
names: .+
В случае запроса на /hello/bob/bobby
по {names}
парам будет «боб / бобби» (слэш нетронутыми) , и было бы до контроллера , чтобы разорвать этот вниз на несколько переменных или оставить его в виде одной строки. Хитрость в этом заключается в том, чтобы изменить это регулярное выражение (". +"), Используемое для фильтрации этого {names}
параметра.
Эта публикация потока стека также подразумевает, что пользовательское регулярное выражение может использоваться для разрешения слешей в параметре маршрута (по крайней мере, в Symfony 2).
Если я попробую это против Drupal 8.0.0-beta15, это не сработает, и указанный контроллер будет запущен только для запроса /hello/bob
. Тем не менее, я могу подтвердить , что это используется для работы в предыдущих беты (я не думаю , что до тех пор , ~ beta13).
Что-то изменилось в интеграции Drupal с компонентом маршрутизации Symfony, что могло бы объяснить это? Возможно, есть альтернативный способ выполнить передачу слэшей в параметрах маршрутизации? Я знаю, что в ядре есть движение к Symfony 3.0 , но я не уверен, что это могло бы что-то объяснить.
Я также знаю, что подписчики маршрутов доступны для управления динамическими структурами маршрутов. Однако для случая, над которым я работаю, требуется почти бесконечная комбинация / количество динамических параметров в конце базового пути (но которые тривиально анализировать в моем контроллере). Я также пытаюсь избежать строк запроса (например /hello?names[]=bob&names[]=bobby
) для этого случая.
Главным образом я просто запутался в связи с разобщением с документацией Symfony, которая, кажется, утверждает, что это должно быть возможно.
Дополнительные замечания
После публикации этого вопроса я обнаружил это обсуждение в основных очередях D8: [Обсуждение] Отключить автоматическую передачу дополнительного аргумента: Да / Нет . Кажется, делается вывод о том, что поддержка «хвоста меню» (что, по сути, мне и нужно) будет официально прекращена в D8. Это обсуждение закончилось 3 года назад, и поэтому я могу только догадываться, что некоторые из более общих особенностей реализации не были полностью реализованы до недавнего времени (~ бета13). Это может объяснить, почему я только сейчас заметил это изменение.
Я предполагаю, что Drupal (не Symfony) теперь генерирует ответ 404, основанный на необработанном запросе с разделителями-косыми чертами, прежде чем какая-либо логика маршрутизации, специфичная для Symfony, дополнительно рассечет маршрут (и его регулярное выражение, специфичное для параметра и т. Д.). Если это так, это может объяснить, почему вышеописанная техника перестала работать. Однако мне все еще интересно, существуют ли альтернативные способы решения этой проблемы, позволяющие избежать использования параметров запросов и подписчиков пользовательских маршрутов.