Problèmes avec les événements dans Symfony2
天蓬老师
天蓬老师 2017-05-16 16:44:46
0
1
537

J'ai regardé le chapitre sur les événements dans Symfony aujourd'hui et j'ai fait une expérience moi-même, mais il y a une chose que je ne comprends pas très bien.
J'ai d'abord défini une classe d'énumération Eents pour gérer tous les événements

<?php
namespace Wolehao\HomeBundle\Event;


final class Events{
  const HOMEPAGE_VISIT = "home.homepage_visit";
}

Un événement est défini dans HomepageBundle

<?php
namespace Wolehao\HomeBundle\Event;
// 这个是sf为你提供的一个基础类
use Symfony\Component\EventDispatcher\Event;

// 你的事件类
class HomepageVisit extends Event {
  public $container;
  public function __construct($container) {
    $this->container = $container;
  }
}

Ensuite, un auditeur est défini dans FileBundle


<?php namespace Wolehao\FileBundle\EventListener; use Wolehao\HomeBundle\Event\HomepageVisit; class FileListener { public function onHomepageVisit(HomepageVisit $event) { $event->container->get("logger")->info("我执行了"); // ... } }

Enregistrez le service dans service.xml

    <services>
        <service id="file.listener" class="Wolehao\FileBundle\EventListener\FileListener">
                <tag name="kernel.event_listener" event="home.homepage_visit" method="onHomepageVisit"/>
        </service>
    </services>

Enfin j'ai déclenché l'événement dans le contrôleur de HomepageBundle

<?php

namespace Wolehao\HomeBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Wolehao\HomeBundle\Event\HomepageVisit;
use Wolehao\HomeBundle\Event\Events;
use Wolehao\FileBundle\Event\Listener;

class DefaultController extends Controller
{
    /**
     * @Route("/home/{name}")
     * @Template()
     */
    public function indexAction($name)
    {

      $event = new HomepageVisit($this->container);
      // 在controller里取事件分发器
      $dispatcher = $this->get('event_dispatcher');
      $dispatcher->dispatch(Events::HOMEPAGE_VISIT, $event);
      return array('name' => $name);
    }

}

Tout d'abord, j'y accède via http://localhost/fm/web/app_dev.php/home/index
Peut imprimer correctement le journal "J'ai exécuté"
Tout semble bien se passer, ce qui indique que l'événement a été déclenché et exécuté avec succès

Maintenant, en cliquant sur la barre de débogage, l'élément d'événement est comme indiqué ci-dessous :

Ce que je ne comprends pas, c'est pourquoi home.homepage_visit est dans Not Called Listeners, mais il est évidemment exécuté ?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

répondre à tous(1)
曾经蜡笔没有小新

Quelle est votre version spécifique de Symfony 2 ?

Si vous rédigez un journal, cela signifie que votre code lié à l'événement est valide.

Les informations affichées dans le profileur (barre de débogage) sont collectées via le collecteur de données. Quant à la raison pour laquelle l'appel à l'auditeur n'est pas enregistré, vous devez connaître plus de détails pour comprendre. jeton et les informations du profileur en détail.

De plus, n'injectez pas directement le conteneur dans l'événement, car cette dépendance est trop large.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal