Согласно документации 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, дополнительно рассечет маршрут (и его регулярное выражение, специфичное для параметра и т. Д.). Если это так, это может объяснить, почему вышеописанная техника перестала работать. Однако мне все еще интересно, существуют ли альтернативные способы решения этой проблемы, позволяющие избежать использования параметров запросов и подписчиков пользовательских маршрутов.
path: /hello/{names}
иusername: .+
нужно делать друг с другом.Ответы:
Вы можете изменить путь, добавив класс, который реализует InboundPathProcessorInterface
Таким образом, маршрутизатор будет интерпретировать путь
/hello/bob/bobby
как,/hello/bob:bobby
и вы получите параметры, разделенные:
(или любой другой символ, который не будет конфликтовать с параметрами) в вашем контроллере.Вам также необходимо зарегистрировать класс как службу в mymodule.services.yml (убедитесь, что приоритет установлен выше 200)
источник
Вы можете сделать следующее для получения параметров пути: В этом случае я хочу получить все, что идет после / rest / в виде массива строк.
Ваш файл yourmodule.routing.yml должен выглядеть примерно так.
или по пути \ to \ yourmodule \ src \ Routing \ RouteProvider.php
Затем добавьте процессор Path к вашему модулю следующим образом. путь \ к \ yourmodule \ SRC \ PathProcessor \ YourModulePathProcessor.php
Наконец, в вашем контроллере сделайте это: path \ to \ yourmodule \ src \ Controller \ YourController.php
источник
Альтернативное решение:
Создайте параметр маршрута, который получает массив json.
mymodule.routing.yml
\ Drupal \ MyModule \ Controller \ Main
источник