2017-10-07 2 views
0

Ich habe ein einfaches Listener Beispiel wie die von https://symfony.com/doc/current/event_dispatcher.html#content_wrapperSymfony 3.3.9 Listener nicht Calles

Das Beispiel ist 1: 1

services.yml ist die gleiche

services: 
    # default configuration for services in *this* file 
    _defaults: 
     # automatically injects dependencies in your services 
     autowire: true 
     # automatically registers your services as commands, event subscribers, etc. 
     autoconfigure: true 
     # this means you cannot fetch services directly from the container via $container->get() 
     # if you need to do this, you can override this setting on individual services 
     public: false 

    # makes classes in src/AppBundle available to be used as services 
    # this creates a service per class whose id is the fully-qualified class name 
    # AppBundle\: 
    #  resource: '../../src/AppBundle/*' 
    #  # you can exclude directories or files 
    #  # but if a service is unused, it's removed anyway 
    #  exclude: '../../src/AppBundle/{Entity,Repository,Tests}' 
    AppBundle\: 
     resource: '../../src/AppBundle/*' 
     # you can exclude directories or files 
     # but if a service is unused, it's removed anyway 
     exclude: '../../src/AppBundle/{Entity,Repository}' 
    # controllers are imported separately to make sure they're public 
    # and have a tag that allows actions to type-hint services 
    # AppBundle\Controller\: 
    #  resource: '../../src/AppBundle/Controller' 
    #  public: true 
    #  tags: ['controller.service_arguments'] 
    AppBundle\Controller\: 
     resource: '../../src/AppBundle/Controller' 
     public: true 
     tags: ['controller.service_arguments'] 

Aber der Listener ist aufgeführt als "Nicht aufgerufene Listener"

Was mache ich falsch?

+0

Könnte ein Prioritätsproblem sein. Die Fehlermeldung bedeutet, dass der Listener erkannt und hinzugefügt wurde. Ich nehme an, Sie haben den richtigen Methodennamen. Es ist also möglich, dass ein anderer Listener mit einer höheren Priorität zuerst aufgerufen wird und dann das Ereignis abbricht. bin/console debug: event-dispatcher könnte helfen. – Cerad

Antwort

2

Eine Klasse kann automatisch gekennzeichnet werden, wenn sie eine bestimmte Schnittstelle implementiert - dies ist der Fall für das EventSubscriber-Beispiel. Wenn ein Listener keinen Hinweis auf den Container-Builder hat (eine Schnittstelle oder eine Klasse, die er erweitert), kann man nicht wissen, ob er als Listener oder für welche Ereignisse markiert werden soll.

Sie möchten wahrscheinlich den Listener explizit in Ihrer Konfiguration markieren, wie im Beispiel.

# app/config/services.yml 
services: 
    AppBundle\EventListener\ExceptionListener: 
     tags: 
      - { name: kernel.event_listener, event: kernel.exception } 

Der Teilnehmer kann abgeleitet werden, da sie eine explizite Abbildung zwischen einem Ereignis hat - getSubscribedEvents(), wie KernelEvents::EXCEPTION und die Klassenmethode ausgeführt werden.

Wie heißt es auf The Symfony 3.3 DI Container Changes Explained

Dies gilt nicht Arbeit für alle Tags. Viele Tags haben Attribute wie Event-Listener, wo Sie auch den Ereignisnamen und die Methode in Ihrem Tag angeben müssen. Autoconfigure funktioniert nur für Tags ohne erforderliche Tag-Attribute

+0

er ist auf 3.3 so Tag wird nicht benötigt, er kann nur AppBundle \ EventListener \ ExceptionListener: Tags: ... – kunicmarko20

+1

Ein Name oder Klassenname, würde genauso gut funktionieren. Ich kopierte aus der Dokumentation, für Geschwindigkeit und Klarheit der Referenz. –

+0

Wenn ich es richtig gelesen habe, muss ich services.yml nicht konfigurieren. In 3.3 werden die Listener im EventListener-Verzeichnis automatisch geladen. – megadruck

Verwandte Themen