Ergebnis 1 bis 7 von 7

Thema: DCA Onload Callback und DependencyInjection

  1. #1
    Contao-Fan Avatar von Monique Hahnefeld
    Registriert seit
    22.11.2011.
    Ort
    Berlin
    Beiträge
    283

    Frage DCA Onload Callback und DependencyInjection

    Hi,

    ich entwickle gerade eine Erweiterung für Isotope eCommerce.
    Iso Productfeed

    Ich bekomme eine Fehlermeldung, wo ich nicht weiterkomme:
    The "Bits\IsoProductfeed\Backend\AboutOnloadCallba ck" service or alias has been removed or inlined when the container was compiled. You should either make it public, or stop using the container directly and use dependency injection instead.
    Ich habe jetzt Doku gelesen, im Internet recherchiert und sämtliche Varianten ausprobiert und ja den Cache habe ich auch immer geleert ;-)

    Nun bin ich nach 6 Stunden etwas Mürbe und hoffe das mir hier jemand weiterhelfen kann.

    Meine services.yaml:
    Code:
    # This file is the entry point to configure your own services.
    # Files in the packages/ subdirectory configure your dependencies.
    
    # Put parameters here that don't need to change on each machine where the app is deployed
    # https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration
    parameters: null
    
    services:
        # default configuration for services in *this* file
        _defaults:
            autowire: true      # Automatically injects dependencies in your services.
            autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        
        Bits\IsoProductfeed\Backend\About:
            class: Bits\IsoProductfeed\Backend\AboutOnloadCallback
            lazy: false
            
        Bits\IsoProductfeed\Controller\AboutController:
            arguments:
                $aboutService: '@Bits\IsoProductfeed\Backend\AboutOnloadCallback'
        # add more service definitions when explicit configuration is needed
        # please note that last definitions always *replace* previous ones
        Bits\IsoProductfeed\Controller\BackendController: 
            arguments:
                 - '@contao.routing.scope_matcher'
            tags:
                 - 'controller.service_arguments'
                
        # makes classes in src/ available to be used as services
        # this creates a service per class whose id is the fully-qualified class name
        Bits\IsoProductfeed\:
            resource: ../../../src
            exclude: 
                - ../../../src/{ContaoManager,DependencyInjection,Resources}
               # - '../../../src/Backend/ConfigModule.php'
               # - '../../../src/Eventlistener/'
    Meine Callback-Klasse:
    Code:
    <?php
    namespace Bits\IsoProductfeed\Backend;
    
    use Contao\DataContainer;
    use Contao\System;
    use Contao\CoreBundle\Framework\ContaoFramework as Framework;
    
    class AboutOnloadCallback
    {
        
        private $framework;
        
          public function __construct(Framework $framework)
        {
            $this->framework = $framework;
        }
        
        public function getInfo(DataContainer $dc): void
        {
            
            $this->framework->initialize();
            // Prüfen, ob der Aufruf im Backend erfolgt
            if (System::getContainer()->get('contao.framework')->isBackend()) {   
            
                $container = System::getContainer();
    
                // Verfügbarkeit des Services prüfen
                if (!$container->has('Bits\IsoProductfeed\Backend\AboutOnloadCallback')) {
                    throw new \RuntimeException('Service "Bits\IsoProductfeed\Backend\AboutOnloadCallback" is not available.');
                }
    
                $aboutService = $container->get('Bits\IsoProductfeed\Backend\AboutOnloadCallback');
            
          
                  $dc->output .= '<div style="margin:10px; padding:10px; background:#f9f9f9; border:1px solid #ccc;">
                        Die Meta-XML-Datei ist eine Datei, die dabei hilft, Produktdaten zwischen verschiedenen Systemen auszutauschen. Sie sorgt dafür, dass alle wichtigen Informationen zu Ihren Produkten, wie Name, Preis, Verfügbarkeit und Bilder, zentral gespeichert sind und automatisch an andere Plattformen weitergegeben werden können.
    
    Mit der Meta-XML-Datei können Ihre Produkte beispielsweise auf Facebook und Instagram dargestellt werden, ohne dass Sie die Produktdaten doppelt einpflegen müssen. Das spart Zeit, reduziert Fehler und sorgt dafür, dass alle Kanäle stets aktuelle Informationen über Ihre Produkte anzeigen. So bleiben Ihre Angebote überall konsistent und professionell.
                      </div>';
            }
    
        }
    }
    Hat jemand eine Idee was ich falsch mache?

    Achso die Table-Datei vielleicht noch:
    Code:
    <?php
    
    use Contao\DC_Table;
    use Bits\IsoProductfeed\Model\ShopConfig;
    use Bits\IsoProductfeed\Model\Attribute;
    
    
    $GLOBALS['TL_DCA']['tl_iso_productfeed'] = array
    (
        // Config
        'config' => array
        (
            'dataContainer'             => DC_Table::class,
            'onload_callback' => array
            (
                array('Bits\IsoProductfeed\Backend\AboutOnloadCallback', 'getInfo')
    ...
    Curiosity killed the cat

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

    Standard

    Wie du DCA Callbacks registrierst ist grundsätzlich hier beschrieben: https://docs.contao.org/dev/framewor...ring-callbacks

    Du hast momentan die älteste Variante gewählt - direkt über PHP, also über die DCA config. Wenn du das so machen willst, musst du auch manuell dafür sorgen, dass der Service public ist. Ich würde dir aber stattdessen empfehlen eine der moderneren Varianten zu wählen - bspw. via PHP Attributes ab PHP 8.
    » sponsor me via GitHub or Revolut

  3. #3
    Contao-Fan Avatar von Monique Hahnefeld
    Registriert seit
    22.11.2011.
    Ort
    Berlin
    Beiträge
    283

    Frage Ok, ich glaube ich habs jetzt Verstanden =)

    Also denke ich zu kompliziert und es ist viel einfacher? Also Contao geht die EventListener-Verzeichnisse durch und fängt da über die Attribute die Callbacks ab?

    Ich habe jetzt wie in der Doku das hier adaptiert:
    Code:
    <?php
    namespace Bits\IsoProductfeed\EventListener\DataContainer;
    
    use Contao\DataContainer;
    use Contao\System;
    use Contao\CoreBundle\DependencyInjection\Attribute\AsCallback;
    
    
    class IsoProductfeedCallbackListener
    {
        
        #[AsCallback(table: 'tl_iso_productfeed', target: 'onload_callback', priority: 100)]
        public function __invoke(DataContainer $dc): void
        {
            // Prüfen, ob der Aufruf im Backend erfolgt
            if (System::getContainer()->get('contao.framework')->isBackend()) {   
            
                $dc->output .= '<div style="margin:10px; padding:10px; background:#f9f9f9; border:1px solid #ccc;">
                        Die Meta-XML-Datei ist eine Datei, die dabei hilft, Produktdaten zwischen verschiedenen Systemen auszutauschen. Sie sorgt dafür, dass alle wichtigen Informationen zu Ihren Produkten, wie Name, Preis, Verfügbarkeit und Bilder, zentral gespeichert sind und automatisch an andere Plattformen weitergegeben werden können.
    
    Mit der Meta-XML-Datei können Ihre Produkte beispielsweise auf Facebook und Instagram dargestellt werden, ohne dass Sie die Produktdaten doppelt einpflegen müssen. Das spart Zeit, reduziert Fehler und sorgt dafür, dass alle Kanäle stets aktuelle Informationen über Ihre Produkte anzeigen. So bleiben Ihre Angebote überall konsistent und professionell.
                      </div>';
          
            }
    
        }
    }
    Ist das so richtig?
    Oder muss ich noch irgendwo was registrieren? (Weil es geht leider noch nicht)
    Curiosity killed the cat

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

    Standard

    Zitat Zitat von Monique Hahnefeld Beitrag anzeigen
    Also Contao geht die EventListener-Verzeichnisse durch und fängt da über die Attribute die Callbacks ab?
    Naja, so nicht direkt. Mit diesen (wie auch vielen anderen) PHP Attributes werden automatisch die jeweiligen Services mit gewissen Tags versehen. Contao sammelt dann alle Services mit diesen Tags und verarbeitet diese dann entsprechend (fügt die Callbacks bspw. entsprechend im DCA hinzu und macht die Services public in diesem Fall).



    Zitat Zitat von Monique Hahnefeld Beitrag anzeigen
    Ist das so richtig?
    Nein, beim Target hast du dich verschrieben. Das muss config.onload sein.



    Zitat Zitat von Monique Hahnefeld Beitrag anzeigen
    Oder muss ich noch irgendwo was registrieren?
    Die PHP Klasse muss halt auch noch als Service an sich registriert sein in irgendeiner Art und Weise - weil die PHP Attribute fügen ja nur wie gesagt die Service Tags hinzu.
    » sponsor me via GitHub or Revolut

  5. #5
    Contao-Fan Avatar von Monique Hahnefeld
    Registriert seit
    22.11.2011.
    Ort
    Berlin
    Beiträge
    283

    Frage Danke schonmal für deine Hilfe

    Also meine services.yaml beinhaltet jetzt:
    Code:
    services:
        # default configuration for services in *this* file
        _defaults:
            autowire: true      # Automatically injects dependencies in your services.
            autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        
        Bits\IsoProductfeed\EventListener\DataContainer\IsoProductfeedCallbackListener:
            tags:
                - { name: 'contao.callback', table: 'tl_iso_productfeed', target: 'config.onload' }
    und mein Callback sieht so aus:
    Code:
    <?php
    namespace Bits\IsoProductfeed\EventListener\DataContainer;
    
    use Contao\DataContainer;
    use Contao\CoreBundle\DependencyInjection\Attribute\AsCallback;
    
    
    class IsoProductfeedCallbackListener
    {
        
        #[AsCallback(table: 'tl_iso_productfeed', target: 'config.onload', priority: 100)]
        public function __invoke(DataContainer $dc): void
        {
                $dc->output .= '<div style="margin:10px; padding:10px; background:#f9f9f9; border:1px solid #ccc;">
                        Die Meta-XML-Datei ist eine Datei, die dabei hilft, Produktdaten zwischen verschiedenen Systemen auszutauschen. Sie sorgt dafür, dass alle wichtigen Informationen zu Ihren Produkten, wie Name, Preis, Verfügbarkeit und Bilder, zentral gespeichert sind und automatisch an andere Plattformen weitergegeben werden können.
    
    Mit der Meta-XML-Datei können Ihre Produkte beispielsweise auf Facebook und Instagram dargestellt werden, ohne dass Sie die Produktdaten doppelt einpflegen müssen. Das spart Zeit, reduziert Fehler und sorgt dafür, dass alle Kanäle stets aktuelle Informationen über Ihre Produkte anzeigen. So bleiben Ihre Angebote überall konsistent und professionell.
                      </div>';
                      
          
            }
    
        
    }
    Damit müsstees eigentlich gehen oder?
    Curiosity killed the cat

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

    Standard

    Du hast den Service jetzt doppelt getagged. Einmal direkt via services.yaml und einmal via PHP Attributes. Du solltest dich lieber für eine Variante entscheiden und diese dann nutzen.
    » sponsor me via GitHub or Revolut

  7. #7
    Contao-Fan Avatar von Monique Hahnefeld
    Registriert seit
    22.11.2011.
    Ort
    Berlin
    Beiträge
    283

    HTML Ok, dann hab ichs jetzt kapiert

    Das ist echt ein bisschen confusing das es so viele Möglichkeiten gibt
    Curiosity killed the cat

Aktive Benutzer

Aktive Benutzer

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

Berechtigungen

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