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éponses


Patrick Bass
Auteur
Réponse acceptée

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: ".*"

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'

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.

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.

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 }