Contao-Camp 2024
Ergebnis 1 bis 7 von 7

Thema: Hook über Invokable Services

  1. #1
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    160

    Standard Hook über Invokable Services

    Hallo zusammen,

    ich versuche gerade anhand der Dokumentation einen Hook über Invokable Services einzubinden.

    https://docs.contao.org/dev/framewor...kable-services

    Ich habe inzwischen mehrere Stunden damit verbracht. Dateinamen und Codeschnipsel zu prüfen, den Cache zu leeren und meine Testerweiterung neu zu installieren. Inzwischen bin ich mit meinem Latein am Ende und auf externe Hilfe angewiesen.

    Die Erweiterung ist für den ersten Schritt möglichst einfach konzipiert. Im Grunde geht es im ersten Schritt lediglich darum, den Hook zu laden.

    Über die composer.json lade ich automatisch alle Klassen im src-Ordner.

    /composer.json
    Code:
    {
    	"name":"bohnmedia/multipage-bundle",
    	"description":"Split page into multiple subpages and assign articles",
    	"keywords":["contao","page","article"],
    	"type":"contao-bundle",
    	"homepage":"https://bohn.media",
    	"license":"MIT",
    	"authors":[
    		{
    			"name":"bohn.media",
    			"homepage":"https://bohn.media",
    			"role":"Developer"
    		}
    	],
    	"require": {
    		"contao/core-bundle":">=4.9"
    	},
    	"require-dev": {
    		"contao/manager-plugin": "^2.0"
    	},
    	"conflict": {
    		"contao/core": "*",
    		"contao/manager-plugin": "<2.0 || >=3.0"
    	},
    	"extra": {
    		"contao-manager-plugin": "BohnMedia\\MultiPageBundle\\ContaoManager\\Plugin"
    	},
    	"autoload":{
    		"psr-4": {
    			"BohnMedia\\MultiPageBundle\\": "src/"
    		}
    	}
    }
    src/MultiPageBundle.php
    PHP-Code:
    <?php

    namespace BohnMedia\MultiPageBundle;

    use 
    Symfony\Component\HttpKernel\Bundle\Bundle;

    class 
    MultiPageBundle extends Bundle
    {
    }
    src/ContaoManager/Plugin.php
    PHP-Code:
    <?php

    namespace BohnMedia\MultiPageBundle\ContaoManager;

    use 
    Contao\CoreBundle\ContaoCoreBundle;
    use 
    Contao\ManagerPlugin\Bundle\BundlePluginInterface;
    use 
    Contao\ManagerPlugin\Bundle\Config\BundleConfig;
    use 
    Contao\ManagerPlugin\Bundle\Parser\ParserInterface;
    use 
    BohnMedia\MultiPageBundle\MultiPageBundle;

    class 
    Plugin implements BundlePluginInterface
    {
        
    /**
         * {@inheritdoc}
         */
        
    public function getBundles(ParserInterface $parser)
        {
            return [
                
    BundleConfig::create(MultiPageBundle::class)
                    ->
    setLoadAfter([ContaoCoreBundle::class]),
            ];
        }
    }
    Die Services werden aus der Datei "/src/Resources/config/services.yml" geladen.

    /src/DependencyInjection/MultiPageExtension.php
    PHP-Code:
    <?php

    namespace BohnMedia\MultiPageBundle\DependencyInjection;

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

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

            
    $loader->load('services.yml');
        }
    }
    Hier definiere ich die Datei, über die der Hook geladen werden soll.

    /src/Resources/config/services.yml
    Code:
    services:
        _instanceof:
            Contao\CoreBundle\Framework\FrameworkAwareInterface:
                calls:
                    - ["setFramework", ["@contao.framework"]]
    
            Symfony\Component\DependencyInjection\ContainerAwareInterface:
                calls:
                    - ["setContainer", ["@service_container"]]
    
        BohnMedia\MultiPageBundle\EventListener\InitializeSystemListener:
            tags:
                - { name: contao.hook, hook: initializeSystem }
    Laut Dokumentation wird automatisch die Funktion "__invoke" verwendet, wenn unter "tags" der Wert "name" auf "contao.hook" gesetzt wird und die Methode weg gelassen wird. Die Funktion trägt wie in der Dokumentation beschrieben den Namen "__invoke" und Annotations wurden definiert.

    /src/EventListener/InitializeSystemListener.php
    PHP-Code:
    <?php

    namespace BohnMedia\MultiPageBundle\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;

    /**
     * @Hook("initializeSystem")
     */
    class InitializeSystemListener
    {
        public function 
    __invoke(): void
        
    {
            exit(
    'works');
        }
    }
    Leider wird die Funktion einfach ignoriert, obwohl ich mich (bis auf den global definierten Namespace) exakt an die Dokumentation gehalten habe. Bin ich blind und sehe den Fehler nicht oder muss die Dokumentation hier ggf. erweitert werden?

    Danke für eure Zeit.

    VG
    Dennis
    Geändert von chatjack (16.03.2021 um 15:50 Uhr)

  2. #2
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    160

    Standard

    Ok, ich fürchte bei den endlosen Neuinstallationen der Erweiterung ist die Installation zwischendurch gescheitert.

    Ich prüfe das kurz.

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

    Standard

    Überprüfe mit

    Code:
    vendor/bin/contao-console debug:container InitializeSystemListener
    ob der Service korrekt registriert und getagged wurde.



    Davon abgesehen ein paar Anmerkungen:

    Du nutzt in deiner services.yml folgendes:

    PHP-Code:
        _instanceof:
            
    Contao\CoreBundle\Framework\FrameworkAwareInterface:
                
    calls:
                    - [
    "setFramework", ["@contao.framework"]]

            
    Symfony\Component\DependencyInjection\ContainerAwareInterface:
                
    calls:
                    - [
    "setContainer", ["@service_container"]] 
    In deinem Service implementierst du diese Interfaces jedoch nicht (solltest du bzw. musst du auch nicht), daher kannst du das entfernen.

    Du taggst deinen Service doppelt. Einmal über die services.yml:

    PHP-Code:
        BohnMedia\MultiPageBundle\EventListener\InitializeSystemListener:
            
    tags:
                - { 
    namecontao.hookhookinitializeSystem 
    und einmal über die Annotation:

    PHP-Code:
    namespace BohnMedia\MultiPageBundle\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;

    /**
     * @Hook("initializeSystem")
     */
    class InitializeSystemListener
    {
        

    Du solltest nur eine der beiden Service-Tagging Methoden nutzen.
    » sponsor me via GitHub or PayPal or Revolut

  4. #4
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    160

    Standard

    Echt bescheuert. Unter Zeitdruck übersehe ich die offensichtlichsten Fehler. Die Erweiterung war nicht mehr installiert und ich passe 2 Stunden lang den Code an und wundere mich, dass nichts passiert.

    Sorry, bin etwas urlaubsreif.

    Gruß
    Dennis

  5. #5
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    160

    Standard

    Hey Spooky,

    danke für die schnelle Antwort. In der Tat verstehe ich noch nicht alles, was in den Configs steckt und übernehme daher noch einiges an unnötigem Code.

    Ich werd den Code entsprechend anpassen und berichten.

    Danke!

  6. #6
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    160

    Standard

    Hallo Spooky,

    ich habe die services.yml jetzt entsprechend angepasst. Die Klasse habe ich jetzt wie folgt definiert.

    PHP-Code:
    services:
        
    BohnMedia\MultiPageBundle\EventListener\InitializeSystemListener: ~ 
    Damit klappt es wunderbar. Der Hook per Annotation wird in der PHP-Datei geladen.

    Besten Dank! Und vielen Dank für die ganze Arbeit, die in die Dokumentation geflossen ist. Die hat mir in den letzten Jahren total geholfen.

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

    Standard

    Mich freut es dass ich helfen konnte bzw. dass die Doku so gut hilft . Und danke für das Sponsoring!
    » sponsor me via GitHub or PayPal or Revolut

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
  •