Ich habe mir heute das Ereigniskapitel in Symfony angesehen und selbst ein Experiment durchgeführt, aber eines verstehe ich nicht ganz.
Ich habe zunächst eine Eents-Aufzählungsklasse definiert, um alle Ereignisse zu verwalten
<?php
namespace Wolehao\HomeBundle\Event;
final class Events{
const HOMEPAGE_VISIT = "home.homepage_visit";
}
Ein Ereignis ist im HomepageBundle definiert
<?php
namespace Wolehao\HomeBundle\Event;
// 这个是sf为你提供的一个基础类
use Symfony\Component\EventDispatcher\Event;
// 你的事件类
class HomepageVisit extends Event {
public $container;
public function __construct($container) {
$this->container = $container;
}
}
Dann wird ein Listener in FileBundle definiert
<?php
namespace Wolehao\FileBundle\EventListener;
use Wolehao\HomeBundle\Event\HomepageVisit;
class FileListener
{
public function onHomepageVisit(HomepageVisit $event)
{
$event->container->get("logger")->info("我执行了");
// ...
}
}
Registrieren Sie den Dienst in 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>
Endlich habe ich das Ereignis im Controller von HomepageBundle ausgelöst
<?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);
}
}
Zuerst greife ich über http://localhost/fm/web/app_dev.php/home/index darauf zu
Kann das „Ich habe ausgeführt“-Protokoll korrekt ausdrucken
Alles scheint in Ordnung zu sein, was darauf hindeutet, dass das Ereignis erfolgreich ausgelöst und ausgeführt wurde
Wenn Sie nun auf die Debug-Leiste klicken, sieht das Ereigniselement wie folgt aus:
Was ich nicht verstehe ist, warum home.homepage_visit in Not Called Listeners enthalten ist, aber offensichtlich ausgeführt wird?
你的symfony 2的具体版本?
如果确实写了log,说明你的event相关代码是有效的。
profiler(debug bar)里显示的信息,是通过data collector收集来的,至于为什么没有记录到listener的调用,则需要知道更多细节才能了解,建议你详细检查xdebug token和profiler信息的对应关系。
另外,不要直接注入container给event,这样依赖过于宽泛了。