Maison  >  Questions et réponses  >  le corps du texte

symfony - Composant EventDispatcher

merci à tous J'ai récemment appris symfony2, et maintenant je ne comprends plus le composant EventDispatcher, et la documentation officielle n'est pas très claire. . Résoudre

ringa_leeringa_lee2683 Il y a quelques jours286

répondre à tous(1)je répondrai

  • 黄舟

    黄舟2017-05-16 16:46:48

    Vous connaissez jQuery ? Le mécanisme événementiel est toujours le même :

    (1) Définissez d'abord le nom de l'événement

    C'est comme le onclick de js, c'est juste une reconnaissance. Vous pouvez définir un nom d'événement tel que : supplier.my_event Pour plus de facilité d'utilisation, vous pouvez utiliser une classe « énumération » pour enregistrer ces événements :

    .
    final class Events
    {
        const MY_EVENT = 'vendor.my_event';
        // 其他event……
    }
    

    Vous pouvez utiliser Events::MY_EVENT dans le code au lieu d'écrire directement la chaîne. Il n'est pas nécessaire de construire cette classe "énumération", mais il est recommandé :

    1. Si vous faites une erreur, une erreur sera signalée directement pour faciliter le débogage
    2. Centralisez-le pour une maintenance facile (sinon vous oublierez quels événements il y a)

    (2) Définir une classe d'événement (définition du contexte)

    En utilisant jQuery, nous ne définissons généralement pas nous-mêmes les classes d'événements, mais en fait cette classe d'événements existe également (celle par défaut est utilisée). Dans le rappel d'événement de jQuery, le premier paramètre accepté est l'objet de la classe d'événement, et cet objet. contiendra des éléments contextuels comme e.target.

    À l'aide d'EventDispatcher de sf, vous définissez votre propre classe d'événement pour effectuer une vérification de type et fournir un contexte pour les rappels (en termes simples, quelles données peuvent être obtenues à partir de l'objet événement).

    // 这个是sf为你提供的一个基础类
    use Symfony\Component\EventDispatcher\Event;
    
    // 你的事件类
    class SomeEvent extends Event
    {
        public function __cosntruct()
        {
            // 按需定义你的事件类
        }
    }
    
    

    (3) Événement déclencheur

    Vous disposez d'un nom d'événement et d'une classe d'événement, et sf vous a déjà équipé d'un répartiteur d'événements. Vous pouvez l'utiliser directement pour déclencher des événements :

    .
    // 事件上可以携带什么,是通过定义你的事件类来实现的
    // 初始化一个事件类,如果你定义了初始化参数,或者事件类上提供了什么方法,就根据需要调用:
    $event = new SomeEvent('参数?');
    $event->someMethod('你自定义的方法');
    
    // 在controller里取事件分发器
    $dispatcher = $this->get('event_dispatcher');
    
    // 将$event,以Events::MY_EVENT事件触发
    $dispatcher->dispatch(Events::MY_EVENT, $event); 
    

    (4) Définir un auditeur (rappel)

    // 引入你事件类的实际命名空间
    use YourNS\SomeEvent;
    
    class SomeListener
    {
        public function onMyEvent(SomeEvent $event)
        {
            // 你从事件上拿到了某个值
            $var = $event->getSomeVar();
            // 然后可以根据这个值做点什么:
            // ...
        }
    }
    

    (5) Faites en sorte que le rappel écoute l'événement correspondant

    Vous pouvez ajouter des rappels en utilisant le code :

    $listener = new SomeListener(); // 你可以把其他(需要解耦的服务注入到这个listener)
    
    $dispatcher = $this->get('event_dispatcher');
    $dispatcher->addListener(Events::MY_EVENT, array($listener, 'onMyEvent'));
    

    Vous pouvez également utiliser la configuration, c'est-à-dire l'injection de dépendances (DIC) :

    #services.yml
    vendor.some_listener:
        class: '回调的类名'
        #arguments: [ 需要调用的服务 ]
        tags:
            - { name: kernel.event_listener, event: vendor.my_event, method: onMyEvent }
    
    

    répondre
    0
  • Annulerrépondre