IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Ajouter des routes dynamiquement [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut Ajouter des routes dynamiquement
    Bonjour,

    Dans Symfony2 (2.0.13) je cherche à ajouter des routes au loader de manière dynamique.

    Pour être plus précis, j'aimerais faire en sorte que je puisse soit charger les annotations dans un controller (@extra ?) ou importer un .yml d'un endroit précis.

    Comment puis-je faire ça dans Symfony2 sachant que dans Symfony1 cela semble être du routing.load_configuration comme équivalent ?

    Merci

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Dynamique pas rapport a quoi ?

  3. #3
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Dynamique dans le sens où :

    - Symfony2 se charge, il lit les config_xxx -> config.yml -> routing.yml qui redirige vers les routing.yml de chaque bundle de base de l'application.

    - Plus tard, je veux ajouter des routes en plus aux routes déjà préchargées au démarrage. Pour faire simple j'aimerais ajouter une instruction du genre :

    addRoutesToSymfony('@MonBundle') ou bien addRoutesToSymfony('@MonBundle/.../routing.yml').

    Pour reformuler, mon Bundle X est connu de symfony (chargement dans AppKernel), et je veux ajouter les routes de ce bundle sans toucher au routing.yml situé dans app/ (pas de resource: "@MonBundle/Resources/config/routing.yml"...). Là où c'est dynamique c'est que je ne connais pas à l'avance le nom de mon Bundle X, je charge ce Bundle X au démarrage de Symfony, mais il peut aussi bien s'appeler Bundle X comme toto (cette partie là c'est bon c'est fait, la récupération des noms des Bundle est géré). La seule chose que je peux figer c'est le routing.yml de mon Bundle X.

    En quelque sorte, je veux trouver comment ajouter ma route à l'objet RouteCollection que Symfony a chargé en mémoire au démarrage en lisant le routing.yml dans app/, et lui dire "ajoutes-moi les pattern contenus dans mon @BundleX/.../routing.yml (si il le faut je peux aussi donner un path absolu genre /var/www/..../BundleXBundle/Resources/.../routing.yml

    Le fait de ne pas toucher au routing.yml dans app/ est une volonté cliente.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    les routes sont déjà dynamique, montre un exemple concret de ton besoin

  5. #5
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    les routes sont déjà dynamique, montre un exemple concret de ton besoin
    Je ne comprends pas. Si je n'indique pas à Symfony où est mon fichier BundleX/.../routing.yml comment va-t-il savoir que /bundlex/{id} est lié à BundleXBundle:MonController:godoitman ?

    Exemple concret :

    - J'ai un bundle Symfony2, bien déclaré au niveau de registerBundles() dans AppKernel.
    - Ce Bundle est un bundle tout ce qu'il y a de plus commun, il possède un fichier routing.yml
    qui définit par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bundlex_tree:
        pattern: /bundlex
        defaults: { _controller: BundleXBundle:Default:index }
    - Je veux informer Symfony2 de ces nouvelles routes mais je n'ai pas le droit de toucher au fichier app/routing.yml pour y ajouter communément la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    _bundle_x_bundle:
       resource: "@BundleXBundle/Resources/config/routing.yml"
    Du fait il me faut pouvoir charger autrement les routes que par le fichier app/routing.yml.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    humm un peu bizarre mais pourquoi pas

    va cherche le service router et rajoute tes routes dans le RouteCollection

    essaye dans ton Bundle de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function boot()
    {
        $collection = $this->container
                           ->get('routing.loader')
                           ->load(__DIR__.'/Resources/config/routing.yml');
     
        $this->container
             ->get('router')
             ->getRouteCollection()
             ->addCollection($collection);
    }

  7. #7
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Parfait ! Je ne connaissais pas du tout cette fonction boot() qui est lancée à chaque fois que le AppKernel fait un new \Project\BundleX\ProjectBundleX().

    Ça fonctionne.

    Je commençais à m'orienter sur ça : http://php-and-symfony.matthiasnobac...ly-add-routes/

    Mais la fonction boot() est infiniment plus simple et plus propre je trouve.

    Merci énormément.

  8. #8
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Erreur de rechargement de cache...

    Le fichier routing.yml est bien lu, je n'ai aucune erreur, mais l'application ne semble pas connaitre la route :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    An exception has been thrown during the rendering of a template ("Route "bundlex_tree" does not exist.")

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    t'as le message quand tu fais un cache:clear ?
    que rend router:debug ?

  10. #10
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    t'as le message quand tu fais un cache:clear ?
    Le cache:clear ne renvoie aucune erreur meme avec le mode debug, auss bien en --env=prod que --env=dev. C'est à l'execution de l'application que l'erreur survient (quand je tente d'utiliser la route dans mon twig).

    Citation Envoyé par stealth35 Voir le message
    que rend router:debug ?
    router:debug me renvoie bien toutes les routes de mon application, sauf celles que je suis censé avoir chargé avec la fonction boot(), ce qui explique que ça ne fonctionne pas du fait.

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    t'as mis quoi dans ton routing.yml

  12. #12
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Pourtant quand dans ma fonction boot() je fais (j'analyse en pas à pas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    $ff = $this->container
                        ->get('router')
                        ->getRouteCollection()
                        ->all();
     
                $this->container
                        ->get('router')
                        ->getRouteCollection()
                        ->addCollection($collection);
     
                $ff2 = $this->container
                        ->get('router')
                        ->getRouteCollection()
                        ->all();
    Alors $ff contient 63 routes et $ff2 contient 69 routes. Preuve que quelque chose a bien été fait.

    Routing.yml :

    Je précise que quand je mets le lien dans app/routing.yml l'application marche (mais je ne peux pas laisser ça dans app/routing.yml).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    bundlex_tree:
        pattern: /bundlex
        defaults: { _controller: ProjectbundlexBundle:Default:index }
     
    bundlex_tree_aa:
        pattern: /tree/aa/{bundlexId}
        defaults: { _controller: ProjectbundlexBundle:Default:aa }
     
    bundlex_tree_bb:
        pattern: /tree/bb/{bundlexId}/{className}
        defaults: { _controller: ProjectbundlexBundle:Default:bb }
     
    bundlex_tree_view:
        pattern: /tree/bundlex/view/{bundlexId}/{bb}/{aa}
        defaults: { _controller: ProjectbundlexBundle:Default:content }
     
    bundlex_edit_index:
        pattern: /bundlex/editView
        defaults: { _controller: ProjectbundlexBundle:bundlex:index }
     
    bundlex_edit_view:
        pattern: /bundlex/editView1/
        defaults: { _controller: ProjectbundlexBundle:bundlex:edit }

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    si je copie ton fichier que je fais un route:debug, j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bundlex_tree                          ANY    /bundlex
    bundlex_tree_classes                  ANY    /tree/classes/{bundlexId}
    bundlex_tree_uuid                     ANY    /tree/uuids/{bundlexId}/{className}
    bundlex_tree_view                     ANY    /tree/bundlex/view/{bundlexId}/{uuid}/{className}
    bundlex_edit_index                    ANY    /bundlex/editView
    bundlex_edit_view                     ANY    /bundlex/editView1/

  14. #14
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    si je copie ton fichier que je fais un route:debug, j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bundlex_tree                          ANY    /bundlex
    (...)
    En utilisant cela dans une fonction boot() et sans rien mettre dans app/routing.yml ?
    Car moi que je fasse router:debug ou route:debug je n'ai justement pas les routes qui s'affichent.

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    ouai avec rien dans le routing.yml de base, t'as quelle version de Symfony ?

  16. #16
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    ouai avec rien dans le routing.yml de base, t'as quelle version de Symfony ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    [symfony]
        git=http://github.com/symfony/symfony.git
        version=v2.0.13
     
    [twig]
        git=http://github.com/fabpot/Twig.git
        version=v1.7.0
     
    [monolog]
        git=http://github.com/Seldaek/monolog.git
        version=1.0.2
     
    [doctrine-common]
        git=http://github.com/doctrine/common.git
        version=2.1.4
     
    [doctrine-dbal]
        git=http://github.com/doctrine/dbal.git
        version=2.1.6
     
    [doctrine]
        git=http://github.com/doctrine/doctrine2.git
        version=2.1.6
     
    [swiftmailer]
        git=http://github.com/swiftmailer/swiftmailer.git
        version=v4.1.7
     
    [assetic]
        git=http://github.com/kriswallsmith/assetic.git
        version=v1.0.3
     
    [twig-extensions]
        git=http://github.com/fabpot/Twig-extensions.git
     
    [metadata]
        git=http://github.com/schmittjoh/metadata.git
        version=1.0.0
     
    [SensioFrameworkExtraBundle]
        git=http://github.com/sensio/SensioFrameworkExtraBundle.git
        target=/bundles/Sensio/Bundle/FrameworkExtraBundle
        version=origin/2.0
     
    [JMSSecurityExtraBundle]
        git=http://github.com/schmittjoh/JMSSecurityExtraBundle.git
        target=/bundles/JMS/SecurityExtraBundle
        version=origin/1.0.x
     
    [SensioDistributionBundle]
        git=http://github.com/sensio/SensioDistributionBundle.git
        target=/bundles/Sensio/Bundle/DistributionBundle
        version=origin/2.0
     
    [SensioGeneratorBundle]
        git=http://github.com/sensio/SensioGeneratorBundle.git
        target=/bundles/Sensio/Bundle/GeneratorBundle
        version=origin/2.0
     
    [AsseticBundle]
        git=http://github.com/symfony/AsseticBundle.git
        target=/bundles/Symfony/Bundle/AsseticBundle
        version=v1.0.1

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    J'ai mis la même version que toi, et ça marche

  18. #18
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    J'ai mis la même version que toi, et ça marche
    Je viens de tester sur un autre bundle que celui-la. En effet ça marche, je dois avoir une petite erreur quelque part.

    La solution fonctionne donc, je mettrai en résolu dès que j'aurai trouver l'erreur.

  19. #19
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    En fait c'est pas mal, je vais m'en resservir pour un projet qui auto charge aussi les bundles

    dans le AppKernel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    use Symfony\Component\Finder\Finder;
     
    public function registerBundles() {
        $bundles = ...
     
        $finder = new Finder();
        $finder->name('*Bundle.php')->in(__DIR__.'/../src');
     
        foreach ($finder as $file) {
            $class = str_replace('\\', '/', $file->getRelativePath()) . '/' . $file->getBasename('.php');
    	$bundles = new $class;
        }
    }

  20. #20
    Membre du Club
    Profil pro
    Développeur Full Stack
    Inscrit en
    Mars 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Full Stack

    Informations forums :
    Inscription : Mars 2009
    Messages : 94
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    En fait c'est pas mal, je vais m'en resservir pour un projet qui auto charge aussi les bundles

    dans le AppKernel

    Tiens j'ai testé cela et j'ai un problème de chargement. C'est peut-être là la clé de mon erreur.

    En fait j'ai mes bundle dans src/CommonBundles, et un bundle dans src/OtherBundles.

    Les src/CommonBundles ont par exemple pour namespaces CommonBundle\TestBundle
    Les src/OtherBundles ont par exemple pour namespaces OtherBundles\BundleXBundle

    Pour tous les CommonBundle\TestBundle, la fonction boot() fait bien son boulot et les routes sont incluses.
    Mais pour OtherBundles\BundleXBundle c'est là justement où ça ne fonctionne pas.

    Dans AppKernel quand je fais new OtherBundles/BundleXBundle/OtherBundlesBundleXBundle() ou que j'utilise ma fonction qui autocharge les bundles, pas de soucis, il arrive à trouver BundleX.

    Quand j'utilise le bout de code que tu viens de mettre au dessus, il me dit en console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PHP Fatal error:  Class 'OtherBundles/BundleXBundle/OtherBundlesBundleXBundle' not found in /var/www/
    L'erreur de la fonction boot() ne serait pas reliée à cela ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Ajouter des éléments dynamiquement a un TMenu
    Par toure32 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 20/06/2008, 10h28
  2. tsql : ajout des colonnes dynamiques
    Par silset dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/06/2008, 15h21
  3. Réponses: 3
    Dernier message: 23/04/2007, 13h14
  4. Réponses: 1
    Dernier message: 19/08/2006, 19h40
  5. Réponses: 1
    Dernier message: 14/08/2006, 09h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo