knplabs/rad-doctrine-event

此包已被废弃,不再维护。未建议替代包。

从 Symfony DIC 访问 doctrine 事件。

v2.2.0 2017-09-21 08:24 UTC

This package is auto-updated.

Last update: 2022-09-23 13:37:18 UTC


README

遗憾的是,我们决定不再维护此项目 anymore (查看原因)。如果您想将其他包标记为替代品,请发送电子邮件至 hello@knplabs.com

快速应用开发:Doctrine 事件

从 Symfony DIC 访问您的 doctrine 事件。

Build Status Scrutinizer Code Quality Latest Stable Version Total Downloads Latest Unstable Version License

官方维护者

安装

composer require knplabs/rad-doctrine-event ~2.1

和 Symfony 一起

class AppKernel
{
    function registerBundles()
    {
        $bundles = array(
            //...
            new Knp\Rad\DoctrineEvent\Bundle\DoctrineEventBundle(),
            //...
        );

        //...

        return $bundles;
    }
}

使用

上下文

假设您有以下实体

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class User
{
    //...
}

之前

为了将 doctrine 事件插入该实体,我们通常会这样做

namespace App\EventListener;

use App\Entity\User;
use Doctrine\ORM\Event\LifecycleEventArgs;

class UserListener
{
    public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if (false === $entity instanceof User) {
            return;
        }

        // Some stuff
    }
}
#services.yml
services:
    app.event_listener.user_listener:
        class: App\EventListener\UserListener
        tags:
            - { name: doctrine.event_listener, event: pre_persist, method: prePersist }

之后

但使用 KnpRadDoctrineEvent,您需要

namespace App\EventListener;

use Knp\Rad\DoctrineEvent\Event\DoctrineEvent;

class UserListener
{
    public function prePersist(DoctrineEvent $event)
    {
        $entity = $event->getEntity();

        // Some stuff
    }
}
#services.yml
services:
    app.event_listener.user_listener:
        class: App\EventListener\UserListener
        tags:
            - { name: kernel.event_listener, event: app.entity.user.pre_persist, method: prePersist }

继承

上下文

假设您有一个扩展另一个实体的实体

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({"page" = "App\Entity\Customer"})
 */
class User
{
    //...
}
namespace App\Entity;

use App\Entity\User;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Customer extends User
{
    //...
}

事件

父实体的事件在子实体之前分发

对于 第一个事件 第二个事件
pre_persist app.entity.user.pre_persist app.entity.customer.pre_persist
post_update app.entity.user.pre_update app.entity.customer.pre_update
...

终止

每个 post (post_persist, post_update, post_remove, post_load) 事件在 kernel.terminate 事件期间也会重新分发。

事件 终止事件
app.entity.user.post_persist app.entity.user.post_persist_terminate
app.entity.user.post_update app.entity.user.post_update_terminate
app.entity.user.post_remove app.entity.user.post_remove_terminate
app.entity.user.post_load app.entity.user.post_load_terminate

配置

您可以将事件重新分发的限制设置为特定实体。

只需遵循以下配置

knp_rad_doctrine_event:
    entities:
        - MyBundle\Entity\User

然后事件将仅针对实体 MyBundle\Entity\User 分发。