Contao-Camp 2024
Ergebnis 1 bis 10 von 10

Thema: Best-Practice: Hooks in Contao4?

  1. #1
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard Best-Practice: Hooks in Contao4?

    Hallo Contao-Forum!

    Ich probiere nun schon seit einigen Stunden herum, aber komme zu keinem Ergebnis und finde leider auch keine ausführlichen Anleitungen.

    Zu meiner Frage:
    Ich würde gerne wissen, wie man in Contao 4.4.x Hooks einbindet und das auf die möglichst sauberste, updatesicherste und für diese Version aktuellste Weise.

    - Über den Weg mit system/modules/ bekomme ich es ohne Probleme hin.
    - Über den Weg mit app/Resources/contao/ bekomme ich es ebenfalls hin.

    Nun habe ich aber mehrmals gelesen, es gäbe noch die Möglichkeit das ganze über den src/ - Ordner im Root der Contao-Installation zu machen und es über

    ```
    "autoload": {
    "psr-4": {
    "App": "src/"
    }
    }
    ```

    in der composer.json laden zu lassen und das auch ohne die Erstellung eines eigenen Bundles, sondern eben nur die Hook.

    Gibt es hierzu eventuell bereits ein ausführliches Tutorial, welches ich nicht über die Google-Suche gefunden habe?
    Oder könnte mir jemand kurz erklären, wie ich hier welche Dateien anlegen muss, damit meine Hook auch richtig geladen wird?
    Oder ist das etwa gar nicht der "aktuellste" Weg zum Laden von Hooks in Contao 4.4.x?

    Ich bedanke mich schon mal ganz freundlich im Vorfeld!

  2. #2
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  3. #3
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    Ein wenig, aber ich hatte es schon so eingerichtet bei mir.
    Habe jetzt nochmal alles entfernt und es in den Src-Ordner gepackt und es entsprechend in meiner Composer.json angepasst.

    Nun werden die Dateien auch gefunden, können aber nicht geladen werden.

    Kurz zu meiner Struktur:

    ~/composer.json
    PHP-Code:
    "autoload": {
            
    "psr-4": {
                
    "App\\""src/"
            
    }
        } 



    ~/app/config/services.yml

    PHP-Code:
    # config/services.yml
    services:
      
    _defaults:
        
    autowiretrue
        autoconfigure
    true
        
    public: false

      App
    \:
        
    resource: ../../src
        exclude
    : ../src/{Entity,Migrations,Model,Resources,Tests}

      
    App\Controller\:
        
    resource: ../../src/Controller
        
    public: true 

    ~/src/fonjensi/EventListener/rewriteinserttag/config/config.php

    PHP-Code:
    <?php

    // Registrieren im Hooks replaceInsertTags
    $GLOBALS['TL_HOOKS']['replaceInsertTags'][] = array('App\fonjensi\EventListener\MyClass''myReplaceInsertTags');

    ~/src/fonjensi/EventListener/rewriteinserttag/myClass.php

    PHP-Code:
    <?php

    /**
     * Run in a custom namespace, so the class can be replaced
     */
    //namespace Vendor\MyModule;
    namespace App\fonjensi\EventListener;

    class 
    MyClass extends \Frontend
    {
        public function 
    myReplaceInsertTags($strTag)
        {
            
    // Parameter abtrennen
            
    $arrSplit explode('::'$strTag);

            if (
    $arrSplit[0] != 'foo' && $arrSplit[0] != 'cache_foo')
            {
                
    //nicht unser Insert-Tag
                
    return false;
            }
            
    // Parameter angegeben?
            
    if (isset($arrSplit[1]) && $arrSplit[1] == 'bar')
            {
                return 
    'Parameter bar';
            } else {
                return 
    'Fehler! foo ohne Parameter!';
            }
        }
    }

    Wenn ich nun versuche den Cache aufzubauen, bekomme ich folgenden Fehler:
    Code:
    In FileLoader.php line 157:
                                                                                   
      Expected to find class "App\fonjensi\EventListener\rewriteinserttag\config\  
      config" in file "/conta  
      o44/src/fonjensi/EventListener/rewriteinserttag/config/config.php" while im  
      porting services from resource "../../src", but it was not found! Check the  
       namespace prefix used with the resource.                                    
                                                                                   
    
    Script Contao\ManagerBundle\Composer\ScriptHandler::initializeApplication handling the post-install-cmd event terminated with an exception
    
                                                                                                       
      [RuntimeException]                                                                               
      An error occurred while executing the "contao:install-web-dir" command:                          
      In FileLoader.php line 157:                                                            
                                                                                       
        Expected to find class "App\fonjensi\EventListener\rewriteinserttag\config\    
        config" in file "/conta    
        o44/src/fonjensi/EventListener/rewriteinserttag/config/config.php" while im    
        porting services from resource "../../src", but it was not found! Check the    
         namespace prefix used with the resource.
    Wo müsste ich hier nun Anpassungen treffen, damit meine Klasse entsprechend gefunden werden kann?
    Vielen Dank schon mal!

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

    Standard

    • Der Dateiname deiner Klasse stimmt nicht mit dem Klassennamen überein.
    • Der Namespace deiner Klasse stimmt nicht mit dem Pfad der Datei überein.


    Halte dich am besten an die Vorgaben aus der Dokumentation.

  5. #5
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Versuche doch mal Deinen Service in der services.yml explizit zu laden (d.h. nicht autoloading Deiner Verzeichnisse zu verwenden). Ich nehme an, da wird etwas gefunden, was gar nicht als Service registriert werden sollte. Von daher: wie sieht denn Deine Verzeichnis-/Dateistruktur unterhalb von src/ aus?
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  6. #6
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    • Der Dateiname deiner Klasse stimmt nicht mit dem Klassennamen überein.
    • Der Namespace deiner Klasse stimmt nicht mit dem Pfad der Datei überein.


    Halte dich am besten an die Vorgaben aus der Dokumentation.

    Hey Spooky,

    ich habe es nun genau so wie in der Dokumentation - https://docs.contao.org/dev/getting-...es-and-actions - beschrieben gemacht.

    Meine Ordnerstruktur sieht wiefolgt aus:

    app/
    config/
    config.yml
    parameters.yml
    routing.yml
    services.yml
    src/
    Controller/
    EventListener/
    ReplaceInsertTagsListener.php



    Code:
    In FileLoader.php line 168:
                                                                                   
      Expected to find class "App\EventListener\ReplaceInsertTagsListener" in fil  
      e "/contao44/app/src/Ev  
      entListener/ReplaceInsertTagsListener.php" while importing services from re  
      source "../src", but it was not found! Check the namespace prefix used with  
       the resource in /conta  
      o44/app/config/services.yml (which is being imported from "/contao44/app/config/config.yml").       
                                                                                   
    
    In FileLoader.php line 157:
                                                                                   
      Expected to find class "App\EventListener\ReplaceInsertTagsListener" in fil  
      e "/contao44/app/src/Ev  
      entListener/ReplaceInsertTagsListener.php" while importing services from re  
      source "../src", but it was not found! Check the namespace prefix used with  
       the resource.                                                               
                                                                                   
    
    Script Contao\ManagerBundle\Composer\ScriptHandler::initializeApplication handling the post-install-cmd event terminated with an exception
    
                                                                                                       
      [RuntimeException]                                                                               
      An error occurred while executing the "contao:install-web-dir" command:                          
      In FileLoader.php line 168:                                                            
                                                                                       
        Expected to find class "App\EventListener\ReplaceInsertTagsListener" in fil    
        e "/contao44/app/src/Ev    
        entListener/ReplaceInsertTagsListener.php" while importing services from re    
        source "../src", but it was not found! Check the namespace prefix used with    
         the resource in /conta    
        o44/app/config/services.yml (which is being imported from "/contao44/app/config/config.yml").         
                                                                                       
                                                                                                       
      In FileLoader.php line 157:                                                            
                                                                                       
        Expected to find class "App\EventListener\ReplaceInsertTagsListener" in fil    
        e "/contao44/app/src/Ev    
        entListener/ReplaceInsertTagsListener.php" while importing services from re    
        source "../src", but it was not found! Check the namespace prefix used with    
         the resource.
    Muss ich noch andere Dateien anlegen/verändern, damit das funktioniert?
    Oder ist die Struktur so nicht richtig?
    Geändert von Fonjensi (21.03.2020 um 18:03 Uhr)

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

    Standard

    Nein, das ist so nicht richtig. Wieso hast du den src/ Ordner unter app/ angelegt?

  8. #8
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Nein, das ist so nicht richtig. Wieso hast du den src/ Ordner unter app/ angelegt?

    Hey Spooky,

    sorry, da muss ich die Anleitung falsch interpretiert haben.
    Ich dachte src/ müsste unter app/ angelegt werden. Sonst stimmt auch die Pfadangabe in der Anleitung in der app/config/services.yml nicht.
    Da musste ich einen Ordner höher gehen, um dieses hinzuzufügen.

    Zudem erscheint mir die Methode zur Hook-Registrierung über Annotations nicht in Contao 4.4.x zu funktionieren, richtig?

    Ich habe es jetzt so zum laufen bekommen:

    In /contao44/app/Resources/contao/config/config.php
    PHP-Code:
    <?php

    $GLOBALS
    ['TL_HOOKS']['replaceInsertTags'][] = array('App\EventListener\ReplaceInsertTagsListener''myReplaceInsertTags');

    Und den bisher angelegten app/src/ habe ich als src/ im Root meiner Contao-Installation abgelegt.

    Dabei bin ich nun nicht mehr über Annotations gegangen, sondern habe es so gemacht:

    /contao44/src/EventListener/ReplaceInsertTagsListener.php

    PHP-Code:
    <?php

    namespace App\EventListener;

    class 
    ReplaceInsertTagsListener extends \Frontend
    {
        public function 
    myReplaceInsertTags($strTag)
        {
            
    // Parameter abtrennen
            
    $arrSplit explode('::'$strTag);

            if (
    $arrSplit[0] != 'foo' && $arrSplit[0] != 'cache_foo')
            {
                
    //nicht unser Insert-Tag
                
    return false;
            }
            
    // Parameter angegeben?
            
    if (isset($arrSplit[1]) && $arrSplit[1] == 'bar')
            {
                return 
    'Parameter bar';
            } else {
                return 
    'Fehler! foo ohne Parameter!';
            }
        }
    }
    Ist das der aktuellste Weg in Contao4.4 oder gibt es noch einen besseren Weg?
    Gibt es einen Weg, bei dem ich die Hook nicht über app/Resources/contao/config/config.php registrieren muss?


    Danke für deine Zeit und Antworten!

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

    Standard

    Wie du Hooks registrierst ist hier dokumentiert: https://docs.contao.org/dev/framewor...istering-hooks
    Bei den einzelnen Arten steht auch immer dabei, ab welcher Contao Version das geht.

  10. #10
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Vielen Dank, Spooky.

    Hast mir sehr weitergeholfen und habe nun ein gewisses Verständnis dafür entwickeln können!

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
  •