Contao-Camp 2024
Ergebnis 1 bis 13 von 13

Thema: Contao Bundle entwickeln > Konfiguration Services

  1. #1
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard Contao Bundle entwickeln > Konfiguration Services

    Hallo zusammen,

    Ich will eine ziemlich veraltete Erweiterung von mir nun als Contao-Bundle unter 4.13.x neu schreiben. Der Setup, so dass ich das Bundle in meiner lokalen Installation via Composer installieren kann, passt soweit.

    Wo ich aber aktuell hänge, das ist z.B bei der Konfiguration der Services. Einfaches Beispiel - ich will über das Bundle ein Command zur Verfügung stellen. Das Registrieren des Command klappt soweit, im Command will ich einen eigenen Service aus dem Bundle benutzen. Die services.yml in meinem Bundle schaut zunächst mal so aus:

    Code:
    services:
        _defaults:
            autowire: true
            autoconfigure: true
            public: true
    Damit müsste es doch so sein, dass ich die einzelnen Services nicht separate definieren muss, sonder wie in diesem Fall einfach nur den Service den ich nutzen will, per __construct() mit dazu holen.

    Den Service welchen ich im Command im __construct() aufrufe, schaut zunächst mal so aus:

    Code:
    use Symfony\Contracts\HttpClient\HttpClientInterface;
    
    class ApiClient
    {
        /**
         * @var HttpClientInterface
         */
        private $httpClient;
    
        public function __construct(HttpClientInterface $httpClient)
        {
            $this->httpClient = $httpClient;
        }
    
        public function getAccessToken()
        {
            dump($this);
        }
    
    }
    Wenn ich den Command nun in der Testinstallation (welche das Bundle enthält) aufrufen will, kommt die Fehlermeldung dass in dem eben genannten ApiClient ein Argument erforderlich ist und keines übergeben wird.

    Hat jemand ne Idee an was das liegen kann - oder liege ich hier grundsätzlich falsch ?

    Danke schon mal
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    Zitat Zitat von creativx Beitrag anzeigen
    Damit müsste es doch so sein, dass ich die einzelnen Services nicht separate definieren muss, sonder wie in diesem Fall einfach nur den Service den ich nutzen will, per __construct() mit dazu holen.
    Definieren musst du sie dann immer noch. Du kannst aber auch alle Klassen aus einem Namespace automatisch als Service registrieren. Siehe zB https://docs.contao.org/dev/getting-...es-and-actions
    » sponsor me via GitHub or PayPal or Revolut

  3. #3
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    okay meine services.yml im Test-Bundle schaut so aus:

    Code:
    services:
        _defaults:
            autowire: true
            autoconfigure: true
            public: true
    
        SgnDev\ContaoTestBundle\:
            resource: ../../../src
            exclude: ../../../src/{Entity,Migrations,Model,Resources,Tests,Widget}
    Mein Testservice schaut so aus:

    Code:
    namespace SgnDev\ContaoTestBundle\Service;
    
    use Symfony\Contracts\HttpClient\HttpClientInterface;
    
    class TestService
    {
        /**
         * @var HttpClientInterface
         */
        private $httpClient;
    
        public function __construct(HttpClientInterface $httpClient)
        {
            $this->httpClient = $httpClient;
        }
    
    }
    Wenn ich dann aber via einem Command, in dem der TestService im Constructor aufgerufen wird, ausführen will, kommt das hier:

    [WARNING] Some commands could not be registered:


    In TestApiClient.php line 18:

    Too few arguments to function SgnDev\ContaoTestBundle\Command\TestApiClient
    ::__construct(), 0 passed in /Users/**/Desktop/Localhost/dev.cont
    ao4-13/var/cache/dev/ContainerQH0WkO7/getConsole_Command_PublicAlias_Clever
    reachtestapiclientService.php on line 23 and exactly 1 expected
    Über

    Code:
    vendor/bin/contao-console debug:container cleverreach:test-api-client
    bekomme ich in der Contao Installation folgendes:

    Code:
    Information for Service "cleverreach:test-api-client"
    =====================================================
    
     ---------------- ----------------------------------------------- 
      Option           Value                                          
     ---------------- ----------------------------------------------- 
      Service ID       cleverreach:test-api-client                    
      Class            SgnDev\ContaoTestBundle\Command\TestApiClient  
      Tags             console.command                                
                       container.no_preload                           
      Public           no                                             
      Synthetic        no                                             
      Lazy             no                                             
      Shared           yes                                            
      Abstract         no                                             
      Autowired        no                                             
      Autoconfigured   yes                                            
     ---------------- ----------------------------------------------- 
    
    
     ! [NOTE] The "cleverreach:test-api-client" service or alias has been removed or inlined when the container was         
     !        compiled.
    Wie kann ich denn prüfen, ob meine services.yml aus dem Test-Bundle in der Contao Installation überhaupt berücksichtigt wird? Also geladen wird sie

    Code:
    class ContaoTestExtension extends Extension
    {
        public function load(array $mergedConfig, ContainerBuilder $container): void
        {
            $loader = new YamlFileLoader(
                $container,
                new FileLocator(__DIR__.'/../Resources/config')
            );
    
            $loader->load('services.yml');
            $loader->load('commands.yml');
        }
    }
    Aber der Service wird nicht auf public:true gesetzt. Ne Idee ?

    Danke
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    Warum willst du ihn auf public setzen?
    » sponsor me via GitHub or PayPal or Revolut

  5. #5
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Warum willst du ihn auf public setzen?
    Ööööhm... naja - weil ich den Service ja quasi außerhalb des Test-Bundles nutzen will. So zu mindest mein Gedankengang, kann natürlich auch völliger Käse sein
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    public musst du den Service nur machen, wenn du den Service vom Container holen willst bzw. diese Möglichkeit geben willst. Innerhalb von Contao kann das in Legacy Code wichtig sein, wo du nicht DependencyInjection nutzen kannst. Also alle Services, die du mit
    PHP-Code:
    System::getContainer()->get(
    nutzen möchtest, müssen public sein. Wenn du den Service aber ganz normal per DI nutzt, dann muss der Service nicht public sein.
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Okay, hab ich glaub mal soweit verstanden

    An was kann es dann noch liegen, dass ich die Meldungen hier bekomme:

    [WARNING] Some commands could not be registered:


    In TestApiClient.php line 18:

    Too few arguments to function SgnDev\ContaoTestBundle\Command\TestApiClient
    ::__construct(), 0 passed in /Users/**/Desktop/Localhost/dev.cont
    ao4-13/var/cache/dev/ContainerQH0WkO7/getConsole_Command_PublicAlias_Clever
    reachtestapiclientService.php on line 23 and exactly 1 expected
    Hast du mir ne Idee wo ich da vielleicht noch einen Fehler habe?
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    Woher kommt den überhaupt die Service ID cleverreach:test-api-client? Hast du diesen Service doch dediziert definiert?
    » sponsor me via GitHub or PayPal or Revolut

  9. #9
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Jetzt bin ich mal ein Stück weiter - ja den Service habe ich definiert - also als Registrierung für ein Command.

    Als DependencyInjection mache ich folgendes:

    PHP-Code:
    class ContaoTestExtension extends Extension
    {
        public function 
    load(array $mergedConfigContainerBuilder $container): void
        
    {
            
    $loader = new YamlFileLoader(
                
    $container,
                new 
    FileLocator(__DIR__.'/../Resources/config')
            );

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

    Die services.yml schau nun so aus:

    Code:
    services:
        _defaults:
            autowire: true
            autoconfigure: true
            public: true
    
        SgnDev\ContaoTestBundle\:
            resource: ../../../src
            exclude: ../../../src/{Entity,Migrations,Model,Resources,Tests,Widget}
    
        SgnDev\ContaoTestBundle\Service\Http\ApiClient:
            public: false
    und die commans.yml schau so aus:

    Code:
    services:
        _defaults:
            autoconfigure: true
            public: false
    
        cleverreach:test-api-client:
            class: SgnDev\ContaoTestBundle\Command\TestApiClient
            tags: ['console.command']
            arguments:
              [ '@SgnDev\ContaoTestBundle\Service\Http\ApiClient' ]
    Wenn ich jetzt in meiner Contao Installation in der mein Test-Bundel installiert ist, das Command

    Code:
    cleverreach:test-api-client
    aufrufe, dann klappt alles mal soweit.

    Ist das so ganz grob richtig, oder nur Zufall dass es funktioniert
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    Entferne deine commands.yml mal komplett (damit du nicht autowiring mit nicht-autowiring und autoregistration mit nicht-autoregistration mischst, vorerst zumindest).
    » sponsor me via GitHub or PayPal or Revolut

  11. #11
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Oh, stimmt - das war etwas wiedersprüchlich

    Hab jetzt alles in die services.yml gepackt und es läuft...

    Code:
    services:
        _defaults:
            autowire: true
            autoconfigure: true
            public: true
    
        SgnDev\ContaoTestBundle\:
            resource: ../../../src
            exclude: ../../../src/{Entity,Migrations,Model,Resources,Tests,Widget}
    
        SgnDev\ContaoTestBundle\Service\Http\ApiClient:
            public: false
    
        cleverreach:test-api-client:
            class: SgnDev\ContaoTestBundle\Command\TestApiClient
            tags: [ 'console.command' ]
            arguments:
              [ '@SgnDev\ContaoTestBundle\Service\Http\ApiClient' ]
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    Entferne auch die Definition deines Commands, das sollte nicht notwendig sein (solange du dich an die Dokumentation hältst).
    » sponsor me via GitHub or PayPal or Revolut

  13. #13
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Perfekto... läuft auch ohne Definition in der services.yml

    Danke
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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
  •