Symfony2呼叫用户主义和其他

时间:2014-07-19 16:00:04

标签: symfony events doctrine-orm subscriber

我创建订阅者并注册新服务,我做了什么: 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没有派遣一样。 有人知道我做的事情有多强大吗?

(为了便于解释,现在我只注册了学说事件,但是我会在同一地点注册更多)

1 个答案:

答案 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