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é ?
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.