我创建订阅者并注册新服务,我做了什么: https://gist.github.com/Draeli/2c591c16409a5664ae58
<?php
namespace My\BlogBundle\Listener;
use Doctrine\ORM\Events;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
class BlogArticleDetailListener implements EventSubscriberInterface
{
/**
* @var ContainerInterface
*/
protected $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
static public function getSubscribedEvents()
{
return array(
'doctrine.event_subscriber' => array(
array(Events::prePersist, 0),
array(Events::preUpdate, 0),
),
);
}
public function prePersist(FilterResponseEvent $event)
{
var_dump('prePersist');die;
}
public function preUpdate(FilterResponseEvent $event)
{
var_dump('preUpdate');die;
}
}
services:
my_blog.listener.blog_article_detail:
class: My\BlogBundle\Listener\BlogArticleDetailListener
arguments: ["@service_container"]
tags:
- { name: kernel.event_subscriber }
但在这种情况下,方法prePersist和preUpdate尽管我坚持对象,就像Doctrine没有派遣一样。 有人知道我做的事情有多强大吗?
(为了便于解释,现在我只注册了学说事件,但是我会在同一地点注册更多)
答案 0 :(得分:1)
<强>服务强>
目前,侦听器正在侦听使用Symfony内核事件调度程序调度的事件,而您应该正在侦听Doctrine事件调度程序。
您的服务......
services:
my_blog.listener.blog_article_detail:
class: My\BlogBundle\Listener\BlogArticleDetailListener
arguments: ["@service_container"]
tags:
- { name: kernel.event_subscriber }
应该有标签doctrine.event_subscriber
而不是内核。
<强>订户强>
在创建Doctrine订阅者而不是Symfony内核订阅者时,您应该实现\Doctrine\Common\EventSubscriber
,这意味着getSubscribedEvents
方法不应该是静态的。
目前,您的订阅者正在侦听名为doctrine.event_subscriber
的事件,而不是收听Doctrine事件。
您实际上应该只是使用...
来收听Doctrine事件public function getSubscribedEvents()
{
return array(
Events::prePersist, // I'm not sure about setting
Events::preUpdate, // the priorities to be honest
);
}
使用Doctrine事件,您将无法获得FilterResponseEvent
作为Doctrine在事件中使用特定参数对象(主要是Doctrine\Common\Persistence\Event\LifecycleEventArgs
)进行调度。有关参数(和事件)的更多信息,您可以查看documentation。