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 :

Lister des bundles encore non installés.


Sujet :

Symfony PHP

  1. #1
    Membre régulier Avatar de DarckCrystale
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Juin 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 71
    Points : 109
    Points
    109
    Par défaut Lister des bundles encore non installés.
    Bonjour à tous et à toutes !

    J'ai un problème insoluble aujourd'hui : lister dans Symfony2 des bundles qui ne seraient pas encore activés dans AppKernel.php.

    Pour la question de l'utilité, ce serait pour créer une commande qui permettrait d'activer ou de désactiver les bundles directement depuis le app/console de symfony.

    J'ai donc essayé des trucs comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // Récupération des classes déclarées dans le projet
    $allClasses = get_declared_classes();
    $mesBundles = array();
    $nbClasses=count($allClasses);
    // Listing des classes Bundle
    for($i=0;$i<$nbClasses;$i++)
    {
        // On récupère les classes via une expression régulière
        if(preg_match("/Bundle$/", $allClasses[$i]))
        {
            $mesBundles[]=$allClasses[$i];
        }
    }
    Sauf que ça ne va pas chercher toutes les classes déclarées dans le projet mais juste celles déclarées dans le script :/ C'est ballot, parce que le Kernel nous offre une méthode qui s'appelle isClassInActiveBundle(), à laquelle on passe en paramètre un bundle avec son namespace et renvoie true s'il est bien activé.
    Y a-t-il donc un machin préfabriqué qui serait capable de retourner un tableau de toutes les classes déclarées en partant d'un dossier par exemple ?

    Sinon, j'avais pensé à :
    • lister tous les namespaces du projet, mais il n'y a apparemment pas de fonction php qui existe pour ça.
    • parcourir récursivement le projet depuis le dossier vendor pour récupérer toutes les classes avec Bundle dans leur nom.
    • essayer de récupérer toutes les classs qui extends Bundle, mais pareil j'ai pas trouvé de fonction qui aille bien.


    Auriez-vous une petite piste à me donner ?

  2. #2
    Membre régulier Avatar de DarckCrystale
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Juin 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 71
    Points : 109
    Points
    109
    Par défaut
    Pour l'instant :
    Je liste les fichiers finissant par "Bundle.php" :

    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
    function GetAllFiles($folder, $recursif = true) {
     
            $files = array();
            $dir = opendir($folder);
            while ($file = readdir($dir)) {
                if ($file == '.' || $file == '..')
                    continue;
                if (is_dir($folder . '/' . $file)) {
                    if ($recursif == true)
                        $files = array_merge($files, $this->GetAllFiles($folder . '/' . $file));
                } else {
                        if (strtolower("bundle.php") == strtolower(substr($file, -strlen("bundle.php")))) {
                            $files[] = $folder . '/' . $file;
                            break;
                    }
                }
            }
            closedir($dir);
            return $files;
        }
    Ce qui me retourne des trucs de ce type :
    ./vendor/doctrine/doctrine-fixtures-bundle/Doctrine/Bundle/FixturesBundle/DoctrineFixturesBundle.php<br>
    ./vendor/doctrine/doctrine-bundle/Doctrine/Bundle/DoctrineBundle/DoctrineBundle.php<br>
    ./vendor/sensio/generator-bundle/Sensio/Bundle/GeneratorBundle/SensioGeneratorBundle.php<br>
    ./vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/SensioDistributionBundle.php<br>
    ./vendor/sensio/framework-extra-bundle/Sensio/Bundle/FrameworkExtraBundle/SensioFrameworkExtraBundle.php<br>
    ./vendor/friendsofsymfony/user-bundle/FOS/UserBundle/FOSUserBundle.php<br>
    ./vendor/symfony/monolog-bundle/Symfony/Bundle/MonologBundle/MonologBundle.php<br>
    ./vendor/symfony/swiftmailer-bundle/Symfony/Bundle/SwiftmailerBundle/SwiftmailerBundle.php<br>
    ./vendor/symfony/assetic-bundle/Symfony/Bundle/AsseticBundle/Tests/TestBundle/TestBundle.php<br>
    ./vendor/symfony/assetic-bundle/Symfony/Bundle/AsseticBundle/AsseticBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Component/Intl/ResourceBundle/Util/ArrayAccessibleResourceBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Component/Intl/ResourceBundle/CurrencyBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Tests/Fixtures/ExtensionPresentBundle/ExtensionPresentBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Tests/Fixtures/FooBarBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Bundle/Bundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/BaseBundle/BaseBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/TestBundle/Sensio/Cms/FooBundle/SensioCmsFooBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/TestBundle/Sensio/FooBundle/SensioFooBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/TestBundle/Fabpot/FooBundle/FabpotFooBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/TestBundle/FooBundle/FooBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/TestBundle/TestBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Bundle/TestBundle/TestBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Bundle/WebProfilerBundle/WebProfilerBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Bundle/SecurityBundle/SecurityBundle.php<br>
    ./vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle/TwigBundle.php<br>
    ./vendor/symfony/icu/Symfony/Component/Icu/IcuRegionBundle.php<br>
    Si vous avez moyen de faire mieux, n'hésitez pas.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    Je suis désolé mais je n'ai pas la réponse à ta question.
    Mais ta problématique est plutôt intéressante et surtout ton objectif.

    As tu pensée regarde un peu le code source derrière les fichiers comme AppKernel.php par exemple ?

    Ca peut parfois donné des idées sans forcement tout comprendre.

  4. #4
    Membre régulier Avatar de DarckCrystale
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Juin 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 71
    Points : 109
    Points
    109
    Par défaut
    Merci miltone de ta réponse

    Encore heureux que la problématique soit intéressante, sinon je l'aurais mauvaise de me creuser la tête pour rien ^^'

    Dans AppKernel.php, on a un gros pavé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $bundles = array(
                new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
                new Symfony\Bundle\SecurityBundle\SecurityBundle(),
                new Symfony\Bundle\TwigBundle\TwigBundle(),
                new Symfony\Bundle\MonologBundle\MonologBundle(),
                new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
                new Symfony\Bundle\AsseticBundle\AsseticBundle(),
                new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
                new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
            );
    Et ce super pavé, il faut le remplir à la main à chaque fois qu'on se farcit l'installation d'un bundle en plaçant la chaîne fournie par le développeur (ex : new Acme\Bundle\ExempleBundle\AcmeExempleBundle())
    Cette chaîne comprend le namespace suivi du nom du bundle (c'est à dire le nom de la classe -et donc du fichier php qui contient la classe) car un bundle est une classe qui extends Bundle !

    Donc si on pouvait récupérer tous les enfants d'une classe, ce serait merveilleux ! Mais ce n'est pas possible T_T

    Du coup, là j'explore deux pistes :
    • trouver comment utiliser l'autoload de Symfony qui apparemment est auto complété lors de l'installation des bundles via composer (des fois qu'il répertorie les classes bundle chargées)
    • récupérer tous les fichiers qui finissent par "bundle.php" dans le dossier vendor (ça, ça marche) et vérifier s'ils existent dans AppKernel.php


    Mais si vous avez des idées, n'hésitez pas, je suis preneuse.

  5. #5
    Membre régulier Avatar de DarckCrystale
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Juin 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 71
    Points : 109
    Points
    109
    Par défaut
    Bon, pour l'instant, je parviens à faire ceci :
    Nom : NouvelEssai.png
Affichages : 89
Taille : 58,2 Ko

    C'est à dire trier les différents namespaces/bundles.

    Je vais d'abord chercher tous les namespaces déclarés dans autoload_namespace.php, je filtre ceux qui finissent par Bundle, et j'en fais un tableau.
    Je vais ensuite chercher tous les bundles déclarées dans le AppKernel.php, je récupère leur namespace et je le mets dans un tableau.
    Ensuite, je fais un peu de théorie des ensembles, en utilisant les fonctions telles que array_intersect et array_diff :
    A = les bundles qui existent mais ne sont pas installés,
    B = les bundles qui n'existent pas dans l'autoload, donc qui ne font partie que du projet et pas des vendors,
    A inter B = les bundles qui existent et sont activés.
    Nom : 250px-Venn_A_intersect_B.svg.png
Affichages : 81
Taille : 12,2 Ko

    Les problèmes :
    • Il faut impérativement que les types qui fabriquent des bundles suffixent leur namespace par Bundle
    • Les bundles étranges, comme Symfony\Bundle\FrameworkBundle ne sont pas chargés dans l'autoload avec un chemin qui finit par bundle, donc lors de la séparation en catégories de bundles, ils ne sont pas triés correctement.


    Encore une fois, si vous avez des idées, n'hésitez pas !

Discussions similaires

  1. [2.x] installation des bundles tiers sous Symfony2
    Par raouldong dans le forum Symfony
    Réponses: 16
    Dernier message: 13/01/2012, 17h45
  2. Lister des fichiers sous Linux pour un utilisateur non root
    Par identifiant_bidon dans le forum Général Java
    Réponses: 4
    Dernier message: 18/10/2011, 15h53
  3. [PowerShell] Lister des appli installées sur un serveur
    Par qcixmauk dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 20/05/2011, 16h34
  4. Réponses: 29
    Dernier message: 10/07/2009, 13h56
  5. lister des dossiers dans un ComboBox
    Par taulmaril dans le forum Windows
    Réponses: 7
    Dernier message: 01/05/2004, 14h31

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