2012-02-21 13 views
24

Sto tentando di creare un'ereditarietà di bundle semplice come indicato in here e ho riscontrato un problema con i percorsi. Sto usando le annotazioni per il routing. Quando registro il mio pacchetto figlio in AppKernel.php, tutti i percorsi dei pacchetti parent vengono persi.Associazione di bundle Symfony2 che perde le route dei pacchetti padre

Per quello che ho capito dalla documentazione Symfony2 dovrebbe cercare tutti i file, inclusi i percorsi, prima dal bundle figlio e poi dal pacchetto genitore. Ora che non sta succedendo, sembra che vengano caricati solo i controller di bundle figlio.

Nel mio bambino fasci di file Bundle ho implementato la funzione getParent come indicato, e nel mio routing.yml ho:

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

che ha lavorato bene prima della eredità.

Ho verificato che il sistema funziona correttamente se include tutti i file del controller separatamente in routing.yml ma questo sembra un modo molto macchinoso per far funzionare l'ereditarietà in quanto desidero sovrascrivere solo alcune parti del pacchetto genitore (non tutte controllori).

Il profilo mostra entrambi i miei pacchetti come attivi.

risposta

16

Ho trovato la soluzione giusta per questo problema. Oggi stavo anche cercando di sovrascrivere un pacchetto genitore configurato con il routing di annotazioni e ho anche scoperto che le rotte genitore venivano ignorate se il routing di anotizzazione importasse l'intero pacchetto ("@ SomeBundle/Controller").

Dopo un po 'di debug, ho trovato che la spiegazione per questo è che se si utilizza "@" come prefisso per il controller questo passerà al risolutore del kernel che restituirà SOLO la risorsa figlio se la risorsa genitore è stata sostituita. Quindi la soluzione è fornire il percorso completo del bundle, considerando che il kernel proverà ad abbinare la risorsa dall'app /Risorse quindi dovrai aggiungere una directory relativa (../../) prima del percorso effettivo :

# 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 

Ciò funzionerà come previsto: tutti gli itinerari genitore saranno importati e verranno sovrascritti da tutte le linee indicate nel bundle bambino.

+0

anche 3 anni dopo trovo questo utile, anche se un po 'inaspettato, anche se estendi i controller nello stesso pacchetto, le annate di routing genitore saranno ignorate, quindi se vuoi avere un codice condiviso, devi ricorrere a un tratto o usare un SharedController da cui tutti si estendono ma senza percorsi in esso – DarkMukke

+0

Salvato il mio giorno. Grazie mille per la tua soluzione –

+0

anche al 2017 questa è un'informazione molto utile. Serbatoi per questo! –

0

Con l'ereditarietà del gruppo, è possibile eseguire l'override dei file del gruppo principale.

Se si crea un file di instradamento nella stessa posizione dei genitori nel pacchetto (se il routing del file principale è su ParentBundle/Resources/config/routing.yml e si crea un file di routing su ChildBundle/Resources /config/routing.yml, sovrascriverà il routing.yml del genitore e symfony userà solo il routing.yml del figlio.

Non ho provato, ma se si importa il routing.yml del bundle del genitore nel routing.yml del bundle figlio, è possibile risolvere il problema. Siccome il router Symfony sceglierà sempre il primo percorso corrispondente trovato, puoi sovrascrivere il percorso specifico desiderato scrivendo il codice di routing relativo sopra il codice di importazione.

+2

Sembra che tu non possa importare childs routing.yml perché crea un riferimento circolare. – teemup

10

In aggiunta alla risposta precedente, dovevo anche cambiare il nome del routing.yml del bundle figlio (ad es. Routing_child.yml) per farlo funzionare. Presumo che questo sia dovuto al fatto che Symfony ignora totalmente il file di routing del bundle genitore se il nome è identico.

EDIT: In molti casi è anche pratico per importare le rotte fascio genitore nel file di routing fascio bambino come questo:

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

questo sembra essere il modo più semplice per me, i percorsi assoluti o relativi, come descritto di seguito non ha funzionato per me – ivoba

+2

Quando si utilizza l'ereditarietà del bundle, Symfony sovrascrive qualsiasi file con lo stesso nome (che si tratti di un modello o di un file di configurazione). – wdev

+0

Ecco come ho risolto il problema, con un piccolo aiuto dal FOSUserBundle –

2

La documentazione ufficiale dice che si deve solo copiare il file di routing genitore per il vostro pacco bambino :

Il modo più semplice per "ignorare" il routing di un pacchetto è di non importarlo affatto. Invece di importare il routing di un bundle di terze parti, è sufficiente copiare quel file di routing nell'applicazione, modificarlo e importarlo.

Inoltre, non è possibile includere file del pacchetto di routing con i genitori utilizzando nomi simbolici "@ParentBundle" perché questo nome viene risolto in "@ChildBundle".

Se si desidera veramente includere il file di percorsi padre, è necessario utilizzare il percorso assoluto per quel file o percorso relativo alla directory corrente, ad es.:

# @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" 

Un'altra soluzione è quella di link simbolico il file di routing genitore nel vostro pacco bambino e includerlo con il percorso più breve, vale a dire:

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

e poi

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

P.S. Spero che troveranno un modo migliore e meno brutto per scavalcare ed estendere il routing dal pacchetto genitore, ma ora dobbiamo vedere alcuni di quei brutti stratagemmi.

+0

Devo dire, anche se dici che sono brutti, il link simbolico è quasi troppo brutto per dirlo. – mattalxndr

Problemi correlati