2016-08-11 2 views
2

Je développe un paquet qui dépend d'un autre.symfony 3.1 Vérifier si un paquet est installé

Afin de gérer le cas où le paquet de base n'a pas été installé, je voudrais effectuer une fonction "bundle_exists()" à l'intérieur d'un contrôleur.

La question est: Comment puis-je avoir une liste de paquets installés ou Comment puis-je vérifier le nom (éventuellement aussi la version) d'un ensemble.

Merci.

+0

Liste des bundles inclus que vous pouvez trouver dans le fichier app/AppKernel.php –

+0

avez-vous déclaré le bundle en tant que dépendance dans les fichiers composer.json de votre bundle? – Matteo

+2

Copie possible de [Comment obtenir une liste de paquets dans symfony2?] (Http://stackoverflow.com/questions/9990961/how-do-i-get-a-list-of-bundles-in-symfony2) –

Répondre

3

Votre classe doit avoir accès à l'objet conteneur (en extension ou DI).
Alors vous pouvez faire;

$this->container->getParameter('kernel.bundles'); 

Cela vous donnera une liste des ensembles installés.

Mise à jour;
Si vous êtes dans un contrôleur qui étend le Symfony\Bundle\FrameworkBundle\Controller\Controller ou dans une classe de commande qui s'étend Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand, vous pouvez simplement obtenir le paramètre.

$this->getParameter('kernel.bundles').

La réponse d'Else @Wouter J est votre meilleure réponse.

+2

Étendre les sons vraiment effrayant et il est préférable d'injecter le paramètre au lieu d'injecter le conteneur complet. –

+0

@WouterJ, juste point (je vais vous donner un upvote) - Je donne juste des options. S'il s'agissait d'un contrôleur, il étendrait normalement le contrôleur principal (à moins qu'il ne soit défini comme service), ce qui à son tour étend ContainerAware. – Rooneyl

1

Vous pouvez obtenir une liste de tous les packs du noyau comme celui-ci:

public function indexAction() 
{ 
    $arrBundles = $this->get("kernel")->getBundles(); 

    if (!array_key_exists("MyBundle", $arrBundles)) 
    { 
     // bundle not found 
    } 

} 
3

En plus de @ réponse de Rooneyl:

Le meilleur endroit pour faire une telle vérification est à l'intérieur your DI extension (par exemple AcmeDemoExtension). Ceci est exécuté une fois que le conteneur est construit et sauvegardé dans le cache. Il n'y a pas besoin de vérifier une telle chose sur chaque requête (le conteneur ne change pas quand il est caché de toute façon), cela ne fera que ralentir votre cache.

// ... 
class AcmeDemoExtension extends Extension 
{ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     $bundles = $container->getParameter('bundles'); 
     if (!isset($bundles['YourDependentBundle'])) { 
      throw new \InvalidArgumentException(
       'The bundle ... needs to be registered in order to use AcmeDemoBundle.' 
      ); 
     } 
    } 
} 
+0

Peut-il être utilisé pour s'assurer qu'un paquet est enregistré avant un autre dans AppKernel? –

+0

@ChristopheWillemsen no. Mais l'ordre d'enregistrement ne devrait jamais influencer quoi que ce soit –

+0

Je suis d'accord, certains projets ont cependant de telles applications (comme Akeneo Enterprise), qui peuvent ensuite entrer en boucle en tant qu'intégrateur d'autres solutions. Merci pour votre réponse. Bonne journée et meilleurs vœux –

0

De Andrey à cette question: How do I get a list of bundles in symfony2?

Si vous voulez appeler une méthode non statique d'objet bundle enregistré (pas de classe), vous pouvez effectuer les opérations suivantes:

$kernel = $this->container->get('kernel'); 
$bundles = $kernel->getBundles(); 
$bundles['YourBundleName']->someMethod(); 

'YourBundleName' est le nom de votre bundle, que vous pouvez obtenir en appelant depuis la console:

php app/console config:dump-reference 
+0

Pourquoi copiez/collez-vous une réponse de l'original à une question dupliquée? –

+0

si le drapeau dupliqué n'est pas accepté, la réponse pourrait être utile. Vous pensez que je ne devrais pas avoir? – goto

+0

Depuis le [Centre d'aide] (http://stackoverflow.com/help/duplicates): "_L'objectif fondamental de la fermeture des questions en double est d'aider les gens à trouver la bonne réponse en obtenant toutes ces réponses au même endroit_" et c'est évidemment que la question ici est: _La question est: Comment puis-je avoir une liste de paquets installés? Je veux ajouter que cette question "_n'affiche aucun effort de recherche_" car il suffit de chercher avec "bundles list" dans la balise symfony2 et cela apparait comme premier résultat. Peut-être qu'un utilisateur expert comme @Wouter_J peut nous donner une meilleure explication. –