Php Symfony EventSubscribe on实体

Php Symfony EventSubscribe on实体,php,symfony,symfony4,Php,Symfony,Symfony4,正在尝试为实体操作(CRUD)创建订阅服务器,但无法找到它 我知道有一种方法,我可以做一个听众,向他发送3个不同的事件,但这不是我想要达到的,我甚至认为这不是一个好的解决方案 事件订阅者 <?php namespace App\EventListener; use App\Entity\Log; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Event\LifecycleEventArgs; use Doctrin

正在尝试为实体操作(CRUD)创建订阅服务器,但无法找到它

我知道有一种方法,我可以做一个听众,向他发送3个不同的事件,但这不是我想要达到的,我甚至认为这不是一个好的解决方案

事件订阅者

<?php

namespace App\EventListener;


use App\Entity\Log;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Events;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;

/**
 * Part of program created by David Jungman
 * @author David Jungman <davidjungman.web@gmail.com>
 */
class EntitySubscriber implements EventSubscriberInterface
{
    /**
     * @var EntityManagerInterface
     */
    private $em;

    /**
     * @var TokenStorageInterface
     */
    private $tokenStorage;

    public function __construct(TokenStorageInterface $tokenStorage, EntityManagerInterface $em)
    {
        $this->em = $em;
        $this->tokenStorage = $tokenStorage;
    }

    public static function getSubscribedEvents()
    {
        return array(
            Events::postPersist,
            Events::postUpdate,
            Events::postRemove,
        );
    }

    public function postUpdate(LifecycleEventArgs $args)
    {
        $this->logEvent($args, "remove");
    }

    public function postRemove(LifecycleEventArgs $args)
    {
        $this->logEvent($args, "remove");
    }

    public function postPersist(LifecycleEventArgs $args)
    {
        $this->logEvent($args, "create");
    }

    private function logEvent(LifecycleEventArgs $args, string $method)
    {
        $entity = $args->getEntity();
        if($entity->getShortName() != "Log")
        {
            $user = $this->tokenStorage->getToken()->getUser();
            $log = new Log();

            $log
                ->setUser($user)
                ->setAffectedTable($entity->getShortName())
                ->setAffectedItem($entity->getId())
                ->setAction($method)
                ->setCreatedAt();

            $this->em->persist($log);
            $this->em->flush();
        }
    }
}
我试过:

我研究了以下两个官方教程: - -

但两者都没有帮助。。当我使用配置的显示部分时,我的计算机冻结

当我尝试调试它时,我可以看到这些方法处于活动状态 (php bin/控制台调试:事件调度器)

但是他们在听“事件”事件,这个事件有自己的体系。但是,使用类
Symfony\Component\EventDispatcher\EventSubscriberInterface您正在实现的,即来自Symfony事件系统的

<?php
use Doctrine\ORM\Events;
use Doctrine\Common\EventSubscriber;  // **the Doctrine Event subscriber interface**
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;

class MyEventSubscriber implements EventSubscriber
{
    public function getSubscribedEvents()
    {
        return array(
            Events::postUpdate,
        );
    }

    public function postUpdate(LifecycleEventArgs $args)
    {
        $entity = $args->getObject();
        $entityManager = $args->getObjectManager();

        // perhaps you only want to act on some "Product" entity
        if ($entity instanceof Product) {
            // do something with the Product
        }
    }
}

<?php
use Doctrine\ORM\Events;
use Doctrine\Common\EventSubscriber;  // **the Doctrine Event subscriber interface**
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;

class MyEventSubscriber implements EventSubscriber
{
    public function getSubscribedEvents()
    {
        return array(
            Events::postUpdate,
        );
    }

    public function postUpdate(LifecycleEventArgs $args)
    {
        $entity = $args->getObject();
        $entityManager = $args->getObjectManager();

        // perhaps you only want to act on some "Product" entity
        if ($entity instanceof Product) {
            // do something with the Product
        }
    }
}