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.
path: /hello/{names}
eusername: .+
tem a ver um com o outro.Respostas:
Você pode alterar o caminho adicionando uma classe que implementa o InboundPathProcessorInterface
Dessa forma, o roteador interpretará o caminho
/hello/bob/bobby
como/hello/bob:bobby
e você terá os parâmetros separados por:
(ou qualquer outro caractere que não entre em conflito com os parâmetros) no seu controlador.Você também precisará registrar a classe como um serviço em mymodule.services.yml (verifique se a prioridade está definida acima de 200)
fonte
Você pode fazer o seguinte para recuperar parâmetros de caminho: Nesse caso, desejo recuperar tudo o que vem depois / rest / como uma matriz de seqüências de caracteres.
Seu arquivo yourmodule.routing.yml deve ser algo como isto.
ou no caminho \ to \ yourmodule \ src \ Routing \ RouteProvider.php
Em seguida, adicione um processador Path ao seu módulo da seguinte maneira. caminho \ to \ yourmodule \ src \ PathProcessor \ YourModulePathProcessor.php
Finalmente, no seu controlador, faça o seguinte: caminho \ para \ seumodulo \ src \ Controller \ YourController.php
fonte
Solução alternativa:
Crie um parâmetro de rota que receba uma matriz json.
mymodule.routing.yml
\ Drupal \ mymodule \ Controller \ Main
fonte