Routes d'un bundle parent lu au lieu de celles des bundles héritant

Ce sujet est résolu
Default
,

Bonjour,

Je travaille sur un projet Symfony2 dans lequel un bundle du style CoreBundle, regroupe toutes les fonctionnalités nécessaires pour l'exécution des routes de la forme groupX.domaine/un-test (group1.domaine/un-test, group2.domaine/un-test,...). Dans le répertoire /app/config/routing.yml, les routes sont sous la forme :

ex_groupX:
    resource: "@EXGroupXBundle/Resources/config/routing.yml"
    prefix: /
    host: "{group}.{domain}"
    defaults:
      domain: %ex_domain%
    requirements:
      domain: "%ex_domain%"
      group:  'groupX'

Il est donc question de créer des bundles GroupXBundle indépendants de façon à ce que les URLs groupX.domaine/un-test ne soient plus gérées par CoreBundle, mais de manière indépendante par le bundle GroupXBundle concerné. Pour ce faire, j'ai copié les fichiers en .twig de CoreBundle vers les repertoires /views de chacun des GroupXBundle et créé les controllers adaptés.
J'ai créé les fichiers routing.yml des bundles GroupeXBundle suivant ce modèle :

ex_groupX_untest:
    path:    /un-test
    host: "{group}.{domain}"
    defaults: { _controller: EXGroupXBundle:Default:untest, domain: "%ex_domain%" }      
    requirements:
      domain: "%ex_domain%"
      group:  'groupX'

Seulement voilà la route /un-test de CoreBundle est exécutée au lieu de celle de GroupeXBundle quand j'essaie d'accéder à l'URL groupX.domain/un-test.
Une suggestion ? Merci d'avance.

5 Réponse

Default
,

Finalement, il a fallu placer ex_first avant la route ci-dessous (gérant tous les groupX) dans app/config/routing.yml de façon à ce que ex_first soit lu en premier lors du "parse".

old_ex_group:
    path: /{group}{baseURL}
    host: "{domain}"
    defaults:
        _controller: EXCoreBundle:EXRedirect:exRedirect
        permanent: true
    requirements:
      group:  '[0-9a-zA-Z][0-9a-zA-Z\-_]{1,99}'
      domain: %ex_domain%
      baseURL: ".*"
Default
,

Bonjour,

Si j'ai bien compris ta question, la solution est simple il faut appeler les routes de ton GroupXBundle avant les route du CoreBundle. (L'ordre est important).

Donc dans ton app/config/routing.yml tu aura un truc qui ressemble à ceci

ex_groupX_bundle:
    resource: "@GroupXBundle/Resources/config/routing.yml"

ex_groupX_core:
    resource: "@EXCoreBundle/Resources/config/routing.yml"
    prefix: /
    host: "{group}.{domain}"
    defaults:
      domain: %ex_domain%
    requirements:
      domain: "%ex_domain%"
      group:  'groupX'
Default
,

Merci hbenyoussef pour ta réponse. Désolé, je viens de corriger une erreur que j'ai faite : dans le répertoire app/config/routing.yml, les routes sont sous la forme :

ex_groupX:
    resource: "@EXGroupXBundle/Resources/config/routing.yml"

et non :

ex_groupX_core:
    resource: "@EXCoreBundle/Resources/config/routing.yml"

Donc logiquement, puisque dans app/config/routing.yml il n'y a que les routes des bundles GroupeXBundle, seuls les fichiers .twig de ces bundles devaient s'afficher et non ceux de CoreBundle.

Default
,

Ta question reste comme même un peut vague. Mais voila ce que je te propose.
A la racine de ton EXGroupXBundle tu le fichier suivant EXGroupXBundle.php. Assure toi que son contenu correspond au code suivant.

// src/EX/GroupXBundle/EXGroupXBundle.php
<?php

namespace EX\GroupXBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class EXGroupXBundle extends Bundle
{
    public function getParent()
    {
        // Ici c'est le nom du bundle parent ce qui aura pour effet de dire que ton EXGroupXBundle hérite de ce dernier.
        return 'EXCoreBundle'; 
    }
}

Si ceci ne resout pas ton problème, essaye de mettre le contenu exacte (complet) des fichier suivants:
app/config/routing.yml
src/EX/GroupXBundle/Ressources/config/routing.yml
src/EX/CoreBundle/Ressources/config/routing.yml si c'est un bundle que tu a téléchargé il se trouvera quelque part dans le dossier vendor

Remarque
Si tu veux surcharger un controlleur/ une vue il faut reproduire l'hierarchie exacte du bundle parent par exemple :
Dans le EXCoreBundle tu a le fichier layout.html.twig dans Ressources/view/layouts/ donc si tu veux surcharger cette view dans ton EXGroupXBundle il faudra créer un fichier layout.html.twig dans Ressources/view/layouts/ du bundle EXGroupXBundle.

Default
,

Merci, hbenyoussef de l'intérêt que vous portez à mon sujet. La cohérence et pertinence de vos propos démontrent une parfaite maîtrise du sujet, ajouté à cela, votre sens du détail, ça fait plaisir !
Le fichier EXGroupXBundle.php est tout à fait conforme et les règles d'héritage dont vous parlez en remarque ont bien été respectées.
Voici le contenu de app/config/routing.yml (mettre tout le contenu sera une répétition inutile, car la même chose se repète, seul groupX change) :

ex_groupX:
    resource: "@EXGroupXBundle/Resources/config/routing.yml"
    prefix: /
    host: "{group}.{domain}"
    defaults:
      domain: "%ex_domain%"
    requirements:
      domain: "%ex_domain%"
      group:  'groupX'

Un extrait de src/EX/GroupXBundle/Ressources/config/routing.yml :

ex_groupX_profile:
    path:    /profile
    defaults: { _controller: EXGroupXBundle:Profile:myProfile }

ex_groupX_signin:
    pattern:    /sign-in
    defaults: { _controller: EXGroupXBundle:Public:signin }

ex_groupX_about:
    pattern:  /about
    defaults: { _controller: EXGroupXBundle:Default:about }

Un extrait de src/EX/CoreBundle/Ressources/config/routing.yml :

ex_core_sign_in:
    pattern:  /sign-in
    defaults: { _controller: EXCoreBundle:Public:signin }

ex_core_about:
    pattern:  /about
    defaults: { _controller: EXCoreBundle:Default:about }

ex_smarterpocket_profile:
    pattern:  /profile
    defaults: { _controller: EXCoreBundle:Profile:myProfile }