Según la documentación de Symfony , una ruta definida a continuación debe activar el controlador especificado para ambos /hello/bob
y /hello/bob/bobby
:
_hello:
path: /hello/{names}
defaults: { _controller: \Drupal\mymodule\Controller\Main::Controller }
requirements:
_access: 'TRUE'
names: .+
En el caso de una solicitud para /hello/bob/bobby
el {names}
parámetro sería "bob / Bobby" (slash intacto) y sería hasta el controlador para dividirla en múltiples variables o dejarlo como una sola cadena. El truco para eso es la expresión regular alterada (". +") Utilizada para filtrar ese {names}
parámetro.
Esta publicación de stackoverflow también implica que la expresión regular personalizada se puede usar para permitir barras en un parámetro de ruta (al menos en Symfony 2).
Si intento esto contra Drupal 8.0.0-beta15 , no funciona y el controlador especificado solo se activa para una solicitud /hello/bob
. Sin embargo, puedo confirmar que esto solía funcionar en versiones anteriores (creo que hasta ~ beta13).
¿Ha cambiado algo en la forma en que Drupal se integra con el componente de enrutamiento de Symfony que explicaría esto? ¿Quizás hay una forma alternativa de lograr el paso de las barras en los parámetros de enrutamiento? Sé que hay un movimiento hacia Symfony 3.0 en el núcleo, pero no estoy seguro de si eso podría explicar las cosas.
También sé que los suscriptores de ruta están disponibles para administrar estructuras de ruta dinámicas. Sin embargo, el caso en el que estoy trabajando requiere una combinación / número casi infinito de parámetros dinámicos al final de una ruta base (pero que son triviales para analizar en mi controlador). También estoy tratando de evitar cadenas de consulta (por ejemplo /hello?names[]=bob&names[]=bobby
) para este caso.
Principalmente, estoy confundido en cuanto a la desconexión con la documentación de Symfony, que parece indicar que esto debería ser posible.
Notas adicionales
Después de la publicación de esta pregunta descubrí esta discusión en las colas centrales D8: [Discusión] gota automatizado pasando de argumento extra: S / N . Parece concluir que el soporte de "cola de menú" (que es esencialmente lo que busco) se eliminará oficialmente en D8. Esa discusión terminó hace 3 años y, por lo tanto, solo puedo adivinar que algunos de los detalles de implementación más generalizados no se realizaron por completo hasta hace poco (~ beta13). Esto puede explicar por qué solo ahora he notado este cambio.
Supongo que Drupal (no Symfony) ahora está generando una respuesta 404 basada en la solicitud delimitada por barra oblicua antes de que cualquiera de la lógica de enrutamiento específica de Symfony diseccione aún más la ruta (y es la expresión regular específica de param, etc.). Si este es el caso, podría explicar por qué la técnica anterior dejó de funcionar. Sin embargo, todavía me pregunto si hay formas alternativas de abordar esta necesidad que eviten el uso de parámetros de consulta y suscriptores de ruta personalizados.
path: /hello/{names}
yusername: .+
tienen que ver el uno con el otro.Respuestas:
Puede alterar la ruta agregando una clase que implemente InboundPathProcessorInterface
De esta forma, el enrutador interpretará la ruta
/hello/bob/bobby
como/hello/bob:bobby
y obtendrá los parámetros separados por:
(o cualquier otro carácter que no entre en conflicto con los parámetros) en su controlador.También deberá registrar la clase como un servicio en mymodule.services.yml (asegúrese de que la prioridad sea superior a 200)
fuente
Puede hacer lo siguiente para recuperar parámetros de ruta: en este caso, quiero recuperar todo lo que viene después / rest / como una matriz de cadenas.
Su archivo yourmodule.routing.yml debería verse así.
o en la ruta \ to \ yourmodule \ src \ Routing \ RouteProvider.php
A continuación, agregue un procesador Path a su módulo de la siguiente manera. ruta \ a \ yourmodule \ src \ PathProcessor \ YourModulePathProcessor.php
Finalmente, en su controlador, haga esto: ruta \ a \ yourmodule \ src \ Controller \ YourController.php
fuente
Solución alternativa:
Cree un parámetro de ruta que reciba una matriz json.
mymodule.routing.yml
\ Drupal \ mymodule \ Controller \ Main
fuente