Ergebnis 1 bis 9 von 9

Thema: Fehlermeldung bei Registrierung eines ContentElements über serivces.yaml

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

    Standard Fehlermeldung bei Registrierung eines ContentElements über serivces.yaml

    Ich versuche aktuell leider vergeblich ein ContentElement über die services.yaml zu registrieren.

    Die letzten Male hatte ich das immer über die Annotations bzw. Attribute gemacht, so wie in der Dokumentation beschrieben. https://docs.contao.org/dev/framework/content-elements/

    Nun musste ich ein paar Einträge in meiner services.yaml vornehmen, um "%kernel.project_dir%" an den Constructor einer Klasse zu übergeben. In Folge dessen wurde die Klasse, die ich bisher über das Attribut registriert hatte, nicht mehr registriert. Da ich alles gerne einheitlich hätte, hatte ich überlegt, nun alles sauber über die services.yaml zu registrieren.

    Selbst in einer frischen Contao 5.3 Installation erhalte ich jedoch eine Fehlermeldung, wenn ich das ContentElement per services.yaml registrieren möchte.

    PHP-Code:
    // src/Controller/ContentElement/ExampleElementController.php
    namespace App\Controller\ContentElement;

    use 
    Contao\CoreBundle\Controller\ContentElement\AbstractContentElementController;
    use 
    Contao\CoreBundle\DependencyInjection\Attribute\AsContentElement;
    use 
    Contao\ContentModel;
    use 
    Contao\Template;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;

    #[AsContentElement(category: 'texts')]
    class ExampleElementController extends AbstractContentElementController
    {
        protected function 
    getResponse(Template $templateContentModel $modelRequest $request): Response
        
    {
            return 
    $template->getResponse();
        }

    Code:
    # config/services.yaml
    services:
        App\Controller\ContentElement\ExampleElementController:
            tags:
                -
                    name: contao.content_element
                    category: texts
    Rufe ich nun "php vendor/bin/contao-console cache:clear" oder "composer install" in der Konsole auf, erhalte ich folgende Fehlermeldung.

    Code:
    In CheckExceptionOnInvalidReferenceBehaviorPass.php line 119:
                                                                                                                                                            
      The service "contao.fragment._contao.content_element.example_element" has a dependency on a non-existent service "Psr\Container\ContainerInterface".
    Geändert von chatjack (02.03.2025 um 21:54 Uhr)

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

    Standard

    Noch ein Nachtrag, wenn ich die ExampleElementController wie folgt über die services.yaml registriere, klappt auch die Lösung über Attribute.

    Code:
    services:
      App\EventListener\DataContainer\GalleryItemLabelCallbackListener:
        arguments:
          $imageFactory: "@contao.image.factory"
          $projectDir: "%kernel.project_dir%"
        tags:
          - {
              name: contao.callback,
              table: tl_gallery_item,
              target: list.label.label,
            }
      App\EventListener\DataContainer\ImageSizesOptionsCallbackListener:
        arguments:
          $imageSizes: "@contao.image.sizes"
          $tokenStorage: "@security.token_storage"
        tags:
          - {
              name: contao.callback,
              table: tl_gallery,
              target: fields.size.options,
            }
      App\Controller\ContentElement\ExampleElementController: ~
    Der Übersicht wegen würde ich es jedoch gerne einheitlich lösen.

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

    Standard

    Nimmt man die Psr\Container\ContainerInterface mit in die services.yaml auf, funktioniert die Registrierung über die services.yaml ohne Probleme.

    Code:
    services:
        Psr\Container\ContainerInterface: '@service_container'
        App\Controller\ContentElement\ExampleElementController:
            tags:
                -
                    name: contao.content_element
                    category: texts

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

    Standard

    Seit Symfony 6.1 ist es möglich, auch Strings per Autowire an die Klasse zu übergeben. Cool!

    Dann wird die service.yaml in meinem Fall nicht mehr gebraucht.

    PHP-Code:
    <?php

    namespace App\EventListener\DataContainer;

    use 
    App\Model\GalleryModel;
    use 
    Contao\CoreBundle\DependencyInjection\Attribute\AsCallback;
    use 
    Contao\CoreBundle\Image\ImageFactoryInterface;
    use 
    Contao\DataContainer;
    use 
    Contao\FilesModel;
    use 
    Contao\StringUtil;
    use 
    Symfony\Component\DependencyInjection\Attribute\Autowire;

    #[AsCallback(table: 'tl_gallery_item', target: 'list.label.label')]
    class GalleryItemLabelCallbackListener
    {
        public function 
    __construct(
            private 
    readonly ImageFactoryInterface $imageFactory,
            
    #[Autowire('%kernel.project_dir%')]
            
    private readonly string $projectDir
        
    ) {}
    https://symfony.com/blog/new-in-symf...ing-attributes

    Falls ich nicht zu doof war, die Dokumentation richtig zu lesen (was ich nicht ausschließen will), müsste die möglicherweise noch ergänzt werden.

    https://docs.contao.org/dev/framewor.../#registration
    Geändert von chatjack (02.03.2025 um 21:55 Uhr)

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

    Standard

    Zitat Zitat von chatjack Beitrag anzeigen
    Selbst in einer frischen Contao 5.3 Installation erhalte ich jedoch eine Fehlermeldung, wenn ich das ContentElement per services.yaml registrieren möchte.

    PHP-Code:
    // src/Controller/ContentElement/ExampleElementController.php
    namespace App\Controller\ContentElement;

    use 
    Contao\CoreBundle\Controller\ContentElement\AbstractContentElementController;
    use 
    Contao\CoreBundle\DependencyInjection\Attribute\AsContentElement;
    use 
    Contao\ContentModel;
    use 
    Contao\Template;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;

    #[AsContentElement(category: 'texts')]
    class ExampleElementController extends AbstractContentElementController
    {
        protected function 
    getResponse(Template $templateContentModel $modelRequest $request): Response
        
    {
            return 
    $template->getResponse();
        }

    Code:
    # config/services.yaml
    services:
        App\Controller\ContentElement\ExampleElementController:
            tags:
                -
                    name: contao.content_element
                    category: texts
    Rufe ich nun "php vendor/bin/contao-console cache:clear" oder "composer install" in der Konsole auf, erhalte ich folgende Fehlermeldung.

    Code:
    In CheckExceptionOnInvalidReferenceBehaviorPass.php line 119:
                                                                                                                                                            
      The service "contao.fragment._contao.content_element.example_element" has a dependency on a non-existent service "Psr\Container\ContainerInterface".
    Unabhängig von der Fehlermeldung: mit diesem Code hast du dein Inhaltselement zwei mal getagged. Einmal via PHP Attribute und einmal direkt in der services.yaml. Du musst dich für eine Variante entscheiden.
    » sponsor me via GitHub or Revolut

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

    Standard

    Danke für den Hinweis. Ich war erst über die Attribute gegangen und hatte sie dann entfernt, um über die services.yaml zu gehen. Nur leider funktionierte die Registrierung über die Attribute nicht mehr, nachdem ich Einträge in der services.yaml vorgenommen hatte. Die Klassen mussten ab da alle in der services.yaml definiert werden. Dank #[Autowire('%kernel.project_dir%')] kann ich das jetzt alles ohne die services.yaml machen. Von daher komme ich so erst Mal wunderbar zurecht.

    Mit dem Beispiel aus der Dokumentation bekomme ich aber trotzdem die Fehlermeldung.

    Screenshot 2025-03-04 180414.jpg

    Code:
    In CheckExceptionOnInvalidReferenceBehaviorPass.php line 119:
                                                                                                                                                            
      The service "contao.fragment._contao.content_element.example_element" has a dependency on a non-existent service "Psr\Container\ContainerInterface".
    Füge ich hier zusätzlich den Psr\Container\ContainerInterface in die services.yaml ein, funktioniert es.

    Code:
    services:
        Psr\Container\ContainerInterface: '@service_container'
        App\Controller\ContentElement\ExampleElementController:
            tags:
                -
                    name: contao.content_element
                    category: texts
    Hier müssten Doku bzw. Code ggf. noch Mal angepasst werden.
    Geändert von chatjack (04.03.2025 um 17:08 Uhr)

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

    Standard

    Zitat Zitat von chatjack Beitrag anzeigen
    Nur leider funktionierte die Registrierung über die Attribute nicht mehr, nachdem ich Einträge in der services.yaml vorgenommen hatte. Die Klassen mussten ab da alle in der services.yaml definiert werden.
    Kommt darauf an, was in deiner services.yaml steht. Wenn du es so wie in der Dokumentation machst, brauchst du nicht alle Services manuell dort definieren.
    » sponsor me via GitHub or Revolut

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

    Standard

    Alles klar, es ging mir letzten Endes nur darum, darauf hinzuweisen, dass man aktuell einen Fehler bekommt, wenn man es 1:1 wie in der Dokumentation im "yaml"-Tab macht.

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

    Standard

    Zitat Zitat von chatjack Beitrag anzeigen
    Alles klar, es ging mir letzten Endes nur darum, darauf hinzuweisen, dass man aktuell einen Fehler bekommt, wenn man es 1:1 wie in der Dokumentation im "yaml"-Tab macht.
    Ja, das ist eher illustrativ.
    » sponsor me via GitHub or Revolut

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
  •