Ergebnis 1 bis 6 von 6

Thema: Problem mit Dependency Injection

  1. #1
    Jayster
    Gast

    Standard Problem mit Dependency Injection

    Ich versuche gerade auf Basis des Skeleton Bundles ein eigenes HelloWorldBundle zu erstellen. Dabei habe ich ein Problem mit der DependencyInjection genauer gesagt mit der Extension Datei unter "src/DependencyInjection", die die "services.yml" laden soll.

    Meine Extension Datei scheint nicht eingebunden zu werden. Ich kann die Services, die ich in der services.yml definiere nicht nutzen und wenn ich in der load-Methode der Extension Datei zum Testen eine Exception auslöse oder ein exit schreibe, wird auch das nicht ausgeführt.

    In der Symfony Dokumentation stehen die Konventionen, die eingehalten werden müssen, damit die Extension Datei automatisch geladen wird: https://symfony.com/doc/current/bundles/extension.html

    Hier der Code meiner Datei. Mein Vendor Name ist "JoergMoldenhauer" mein Bundle Name ist "ContaoHelloWorldBundle".

    src/DependencyInjection/JoergMoldenhauerContaoHelloWorldExtension.php

    PHP-Code:
    namespace JoergMoldenhauer\ContaoHelloWorldBundle\DependencyInjection;

    use 
    Symfony\Component\Config\FileLocator;
    use 
    Symfony\Component\DependencyInjection\ContainerBuilder;
    use 
    Symfony\Component\DependencyInjection\Extension\Extension;
    use 
    Symfony\Component\DependencyInjection\Loader\YamlFileLoader;

    class 
    JoergMoldenhauerContaoHelloWorldExtension extends Extension
    {
        
    /**
         * {@inheritdoc}
         */
        
    public function load(array $mergedConfigContainerBuilder $container)
        {
            
    $loader = new YamlFileLoader(
                
    $container,
                new 
    FileLocator(__DIR__.'/../Resources/config')
            );

            
    $loader->load('services.yml');
        }

    Sieht jemand den Fehler? Oder liegt es vielleicht daran, dass ich die Datei anfangs, als ich meine Erweiterung mit Composer installiert habe, noch unter einem anderen (den Konventionen nicht entsprechenden) Namen hatte? Ich habe schon versucht, den Cache zu leeren und die Autoload Dateien neu zu erstellen mit:
    vendor/bin/contao-console cache:clear
    composer install --optimize-autoloader

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.109
    Partner-ID
    10107

    Standard

    Class name sollte so stimmen - allerdings habe ich da auch schon öfters bemerkt, dass Symfony aus irgendeinem Grund doch einen anderen Namen erwartet. In einem Fall musste ich zB den Vendor Namen weglassen. Also bspw.:
    PHP-Code:
    <?php

    namespace Vendor\HelloWorldBundle\DependencyInjection;

    class 
    HelloWorldExtension
    {

    }
    Vielleicht ist das dann der Fall, wenn der Vendor nicht Teil des physischen Pfades ist.

  3. #3
    Jayster
    Gast

    Standard

    Danke für deine Hilfe! So funktioniert es.

    Dateiname: ContaoHelloWorldExtension.php
    Klassenname: ContaoHelloWorldExtension

    Nach einem Aufruf von "composer install --optimize-autoloader" werden die Services dann richtig geladen.

    EDIT: Man muss nicht unbedingt "optimize-autoloader" verwenden. Es reicht auch, den Cache zu leeren mit "vendor/bin/contao-console cache:clear"
    Geändert von Jayster (06.10.2018 um 13:33 Uhr)

  4. #4
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.467
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    The name is equal to the bundle name with the Bundle suffix replaced by Extension (e.g. the Extension class of the AcmeBundle would be called AcmeExtension and the one for AcmeHelloBundle would be called AcmeHelloExtension).
    Doku lesen, wenn sie doch schon so ausgezeichnet ist! https://symfony.com/doc/current/bundles/extension.html
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.109
    Partner-ID
    10107

    Standard

    Naja, genau in der Doku ist es im Beispiel ja nicht so:
    PHP-Code:
    // src/Acme/HelloBundle/DependencyInjection/AcmeHelloExtension.php
    namespace Acme\HelloBundle\DependencyInjection;

    use 
    Symfony\Component\DependencyInjection\ContainerBuilder;
    use 
    Symfony\Component\DependencyInjection\Extension\Extension;

    class 
    AcmeHelloExtension extends Extension
    {
        public function 
    load(array $configsContainerBuilder $container)
        {
            
    // ... you'll load the files here later
        
    }

    Da ist der Vendor Teil des Klassennamens.

  6. #6
    Jayster
    Gast

    Standard

    Danke nochmal für den Link zur Doku. Die hatte ich zwar schon gelesen (wie im erste Beitrag verlinkt), aber leider falsch verstanden. Ich habe im Beispiel "Acme" als Vendorname interpretiert und gedacht, dass dieser zum Extension Namen gehört, obwohl in der Doku eigentlich klar steht, dass es nur der Bundlename ist.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •