2012-02-21 16 views
24

Estoy tratando de crear una herencia de paquete simple como se indica en here y encontré un problema con las rutas. Estoy usando anotaciones para el enrutamiento. Cuando registro mi paquete hijo en AppKernel.php, todas las rutas de mis paquetes principales se pierden.Symfony2 bundle inheritance perdiendo paquetes principales rutas

Por lo que entiendo de la documentación, Symfony2 debe buscar todos los archivos, incluidas las rutas, primero desde el paquete hijo y luego desde el paquete principal. Ahora que eso no está sucediendo, solo los controladores de paquetes secundarios parecen estar cargados.

En mi niño de lotes de archivos Bundle He implementado la función getParent como se indica, y en mi routing.yml tengo:

ParentBundle: 
resource: "@Parent/Controller/" 
type:  annotation 
prefix: /admin/ 

que funcionaba bien antes de la herencia.

He probado que el sistema funciona bien si incluyo todos los archivos del controlador por separado en routing.yml pero parece una forma muy engorrosa de hacer que funcione la herencia ya que solo quiero anular algunas partes del paquete principal (no todas controladores).

Profiler muestra mis dos paquetes como activos.

Respuesta

16

Encontré la solución adecuada para este problema. Hoy también estaba intentando anular un paquete principal configurado con enrutamiento de anotaciones y también encontré que las rutas principales se ignoraron si el enrutamiento de anotación importó todo el paquete ("@ SomeBundle/Controller").

Después de una pequeña depuración encontré que la explicación para esto es que si usa "@" como prefijo para el controlador esto pasará al sistema de resolución del núcleo que devolverá SOLAMENTE el recurso hijo si el recurso padre ha sido anulado. Entonces, la solución es proporcionar la ruta completa del paquete, considerando que el kernel intentará hacer coincidir el recurso de la aplicación /Resources, por lo que tendrá que agregar un directorio relativo (../../) antes de la ruta real :

# app/config/routing.yml: 
some_parent: 
    resource: "../../src/Application/ParentBundle/Controller" 
    type: annotation 

# ChildBundle implements getParent() method to inherit from ParentBundle 
some_child: 
    resource: "@ChildBundle/Controller" 
    type: annotation 

Esto funcionará como se espera: todas las rutas de padres serán importados y serán sustituidas por todas las rutas especificadas en el paquete de niño.

+0

incluso 3 años después, me parece útil, aunque un poco inesperado, incluso si extiende los controladores en el mismo paquete, las anotaciones de enrutamiento padre se ignorarán, por lo que si desea tener código compartido, debe recurrir a un rasgo o uso un SharedController del que todos se extienden pero sin rutas en él – DarkMukke

+0

Me salvó el día. Muchas gracias por su solución –

+0

incluso en 2017 esta es una información muy útil. Tanques para esto! –

0

Con la herencia de paquetes, puede anular los archivos del paquete principal.

Si crea un archivo de enrutamiento en la misma ubicación que los padres en su paquete (si el enrutamiento del archivo principal está en ParentBundle/Resources/config/routing.yml, y crea un archivo de enrutamiento en ChildBundle/Resources /config/routing.yml), anulará el routing.yml de los padres, y symfony solo usará el routing.yml del niño.

No lo he intentado, pero si importa el routing.yml del paquete principal en el routing.yml del paquete hijo, puede resolver su problema. Como el enrutador Symfony siempre elegirá la primera ruta coincidente que encuentre, puede anular la ruta específica que desee al escribir el código de enrutamiento relevante sobre el código de importación.

+2

Parece que no puede importar el childs routing.yml porque crea una referencia circular. – teemup

10

Además de la respuesta anterior, también tuve que cambiar el nombre del enrutamiento.yml del paquete hijo (por ejemplo, a routing_child.yml) para que funcione. Supongo que esto se debe a que Symfony ignora por completo el archivo de enrutamiento del paquete principal si el nombre es idéntico.

EDIT: En muchos casos también es práctico para importar rutas de paquete de los padres en el archivo de enrutamiento paquete niño como éste:

# routing_child.yml  
_parent: 
    resource: "@MyParentBundle/Resources/config/routing.yml" 
+0

esta parece ser la forma más fácil de imho, absolutas o relativas, como se describe a continuación no funcionó para mí – ivoba

+2

Al usar la herencia de paquetes, Symfony anula cualquier archivo del mismo nombre (ya sea una plantilla o un archivo de configuración). – wdev

+0

Así es como terminé resolviéndolo también, con un poco de ayuda del FOSUserBundle –

2

La documentación oficial dice que usted será simplemente copiar el archivo de enrutamiento de los padres a su paquete niño :

La forma más fácil de "anular" el enrutamiento de un paquete es nunca importarlo en absoluto. En lugar de importar el enrutamiento de un paquete de terceros, simplemente copie ese archivo de enrutamiento en su aplicación, modifíquelo e impórtelo.

Además, no se puede incluir archivo de paquete de enrutamiento de matriz utilizando nombres simbólicos "@ParentBundle" porque este nombre se resuelve a "@ChildBundle".

Si realmente desea incluir el archivo de rutas padre, entonces deberá usar la ruta absoluta a ese archivo o ruta relativa al directorio actual, es decir:

# @YourChildBundle/Resources/routing.yml 
YourParentBundle: 
    resource: "/srv/www/example.com/src/Your/ParentBundle/Resources/routing.yml" 

o

# @YourChildBundle/Resources/routing.yml 
YourParentBundle: 
    resource: "../../../../../Your/ParentBundle/Resources/routing.yml" 

Otra solución consiste en enlazar simbólicamente el archivo de enrutamiento principal dentro de su paquete de niño e incluirlo con la ruta más corta, es decir:

cd YourChildBunde 
ln -s ../../../../../Your/ParentBundle/Resources/routing.yml parent_routes.yml 

y luego

# @YourChildBundle/Resources/routing.yml 
YourParentBundle: 
    resource: "parent_routing.yml" 

P.S. Espero que encuentren una manera mejor y menos fea de anular y extender el enrutamiento desde el paquete padre, pero ahora tenemos que ver algunas de esas feas soluciones.

+0

Tengo que decir que, aunque dices que estos son feos, el enlace simbólico es casi demasiado feo como para mencionarlo. – mattalxndr