2016-08-11 2 views
2

Ich entwickle ein Paket, das von einem anderen abhängig ist.symfony 3.1 Überprüfen, ob ein Paket installiert ist

Um den Fall zu behandeln, dass das Basispaket nicht installiert wurde, werde ich gerne eine "bundle_exists()" -Funktion in einem Controller durchführen.

Die Frage ist: Wie kann ich eine Liste der installierten Bundles oder Wie kann ich nach dem Namen (eventuell auch die Version) eines Bundles überprüfen.

Danke.

+0

Liste der enthaltenen Bundles, die Sie in der Datei app/AppKernel.php finden können –

+0

Haben Sie das Bundle als Abhängigkeit in den composer.json-Dateien Ihres Bundles deklariert? – Matteo

+2

Mögliches Duplikat von [Wie bekomme ich eine Liste von Bundles in symfony2?] (Http://stackoverflow.com/questions/9990961/how-do-i-get-a-list-of-bundles-in-symfony2) –

Antwort

3

Ihre Klasse muss Zugriff auf das Containerobjekt haben (entweder durch Erweitern oder DI).
Dann können Sie tun;

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

Dadurch erhalten Sie eine Liste der installierten Bundles.

Aktualisierung;
Wenn Sie in einem Controller sind, der die Symfony\Bundle\FrameworkBundle\Controller\Controller oder in einer Befehlsklasse erweitert, die erweitert, können Sie nur den Parameter abrufen.

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

Else @Wouter J's Antwort ist deine beste Antwort.

+2

Erweiterung klingt wirklich gruselig und es ist besser, den Parameter zu injizieren, anstatt den kompletten Container zu injizieren. –

+0

@WouterJ, guter Punkt (Ich gebe dir eine positive Bewertung) - Ich gebe nur Optionen. Wenn dies ein Controller wäre, würde er normalerweise den Hauptcontroller erweitern (sofern er nicht als Dienst eingestellt ist), was wiederum ContainerAware erweitert. – Rooneyl

1

Sie eine Liste aller Bundles aus dem Kernel wie folgt zu erreichen:

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

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

} 
3

Neben @ Rooneyl Antwort:

Der beste Ort für eine solche Prüfung zu tun, im Inneren ist your DI extension (zB AcmeDemoExtension). Dies wird ausgeführt, sobald der Container erstellt und zum Zwischenspeichern freigegeben wurde. Es gibt keine Notwendigkeit, solche Dinge bei jeder Anfrage zu überprüfen (der Container ändert sich nicht, solange er zwischengespeichert wird), er bremst nur den 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

Kann dies verwendet werden, um sicherzustellen, dass ein Bundle vor einem anderen in AppKernel registriert wird? –

+0

@ Christophe Willemsen nein. Aber die Reihenfolge der Registrierung sollte nie irgendetwas beeinflussen –

+0

Ich stimme zu, einige Projekte haben jedoch solche Erzwingungen (wie Akeneo Enterprise), die dann in eine Schleife als Integrator zu anderen Lösungen kommen können. Danke für deine Antwort. Einen schönen Tag und die besten Wünsche –

0

Von Andrey auf diese Frage: How do I get a list of bundles in symfony2?

Wenn Sie eine nicht statische Methode der registrierten Bündel Objekt (nicht-Klasse) anrufen möchten, dann können Sie folgendes tun:

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

Wo 'YourBundleName' ist der Name Ihres Bundles, den Sie durch einen Anruf von der Konsole aus abrufen können:

+0

Warum kopierst du eine Antwort vom Original auf eine duplizierte Frage? –

+0

Wenn das duplizierte Flag nicht akzeptiert wird, könnte die Antwort nützlich sein. Du denkst ich sollte nicht haben? – goto

+0

Aus der [Hilfe] (http://stackoverflow.com/help/duplicates): "_Das grundlegende Ziel des Schließens doppelter Fragen besteht darin, den Menschen zu helfen, die richtige Antwort zu finden, indem sie all diese Antworten an einem Ort finden _" und es ist offensichtlich dass die Frage hier ist: _Die Frage ist: Wie kann ich eine Liste der installierten Bündel haben? _. Ich möchte hinzufügen, dass diese Frage "_ keine Forschungsbemühungen zeigt", da nur mit "Bundles-Liste" im Symfony2-Tag suchen und es als erstes Ergebnis angezeigt wird. Vielleicht kann ein Experte wie @Wouter_J uns eine bessere Erklärung geben. –

Verwandte Themen