De acordo com a documentação do Symfony , uma rota definida como abaixo deve acionar o controlador especificado para ambos /hello/bob
e /hello/bob/bobby
:
_hello:
path: /hello/{names}
defaults: { _controller: \Drupal\mymodule\Controller\Main::Controller }
requirements:
_access: 'TRUE'
names: .+
No caso de uma solicitação para /hello/bob/bobby
o {names}
parâmetro, seria "bob / bobby" (barra intacta) e caberia ao controlador decompô-lo em várias variáveis ou deixá-lo como uma única string. O truque é o regex alterado (". +") Usado para filtrar esse {names}
parâmetro.
Essa postagem do stackoverflow também implica que o regex personalizado pode ser usado para permitir barras em um parâmetro de rota (pelo menos no Symfony 2).
Se eu tentar isso com o Drupal 8.0.0-beta15, ele não funcionará e o controlador especificado será acionado apenas para uma solicitação /hello/bob
. No entanto, posso confirmar que isso costumava funcionar em betas anteriores (acho que até ~ beta13).
Algo mudou na maneira como o Drupal se integra ao componente de roteamento do Symfony que explicaria isso? Talvez haja uma maneira alternativa de realizar a passagem de barras nos parâmetros de roteamento? Eu sei que há um movimento em direção ao Symfony 3.0 no núcleo, mas não tenho certeza se isso poderia explicar as coisas.
Também sei que os assinantes de rotas estão disponíveis para gerenciar estruturas de rotas dinâmicas. No entanto, o caso em que estou trabalhando exige uma combinação / número quase infinito de parâmetros dinâmicos no final de um caminho base (mas que são triviais para analisar no meu controlador). Também estou tentando evitar cadeias de consulta (por exemplo /hello?names[]=bob&names[]=bobby
) para este caso.
Principalmente, estou confuso quanto à desconexão com a documentação do Symfony, que parece afirmar que isso deve ser possível.
Notas Adicionais
Depois de postar esta pergunta eu descobri essa discussão nos D8 núcleo filas: [Discussão] Gota automatizado de passagem de argumento extra: Y / N . Parece concluir que o suporte "menu tail" (que é basicamente o que eu estou procurando) será oficialmente descartado no D8. Essa discussão terminou há três anos e, portanto, posso apenas supor que algumas das especificações de implementação mais generalizadas não foram totalmente realizadas até recentemente (~ beta13). Isso pode explicar por que só agora notei essa mudança.
Eu estou supondo que o Drupal (não o Symfony) agora está gerando uma resposta 404 com base na solicitação delimitada por barra antes de qualquer lógica de roteamento específica do Symfony dissecar ainda mais a rota (e é uma regex específica para parâmetros, etc.). Se for esse o caso, pode explicar por que a técnica acima parou de funcionar. Ainda estou me perguntando, no entanto, se existem maneiras alternativas de lidar com essa necessidade que evitam o uso de parâmetros de consulta e assinantes de rotas personalizadas.