0

我创建一个订阅者并注册一个新服务,我做什么: 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 没有调度一样。有人知道我做什么强吗?

(为了解释,现在我只注册教义事件,但之后我会从同一个地方注册更多)

4

1 回答 1

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主要是)调度而得到。有关参数(和事件)的更多信息,您可以查看文档

于 2014-07-19T16:36:22.403 回答