简体   繁体   English

我如何在Symfony中的订户内获取EntityManager

[英]How can i get entityManager inside Subscriber in Symfony

I use Api Platform. 我使用Api平台。 I have subscriber 我有订阅者

namespace App\EventSubscriber\Api;

use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\Product;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
use Symfony\Component\HttpKernel\KernelEvents;

final class ProductCreateSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::VIEW => ['createHost', EventPriorities::POST_WRITE],
        ];
    }

    public function createHost(GetResponseForControllerResultEvent $event)
    {
        $product = $event->getControllerResult();
        $method = $event->getRequest()->getMethod();

        if (!$product instanceof Product || Request::METHOD_POST !== $method) {
            return;
        }

        I NEED ENTITY MANAGER HERE
    }
}

Is it possible to get a entity manager here? 可以在这里找到实体经理吗?

I need create another entity, after creating Product 创建产品后,我需要创建另一个实体

Symfony allow (and recommend) to inject dependencies in services . Symfony允许(并建议) 在服务中注入依赖项

We add a constructor to the subscriber in order to inject Doctrine and make it accessible though $this->entityManager : 我们向订户添加一个构造函数,以便注入Doctrine并通过$this->entityManager使其可访问:

use Doctrine\ORM\EntityManagerInterface;

final class ProductCreateSubscriber implements EventSubscriberInterface
{
    /**
     * @var EntityManagerInterface
     */
    private $entityManager;

    public function __construct(
        EntityManagerInterface $entityManager
    ) {
        $this->entityManager = $entityManager;
    }

    public function createHost(GetResponseForControllerResultEvent $event)
    {
        $product = $event->getControllerResult();
        $method = $event->getRequest()->getMethod();

        if (!$product instanceof Product || Request::METHOD_POST !== $method) {
            return;
        }

        // You can access to the entity manager
        $this->entityManager->persist($myObject);
        $this->entityManager->flush();
    }

If autowiring is enabled, you'll have nothing else to do, the service will be instantiated automatically. 如果启用了自动装配 ,则您无需执行其他操作,该服务将自动实例化。

If not, you'll have to declare the service : 如果没有,则必须声明服务

App\EventSubscriber\Api\ProductCreateSubscriber:
    arguments:
        - '@doctrine.orm.entity_manager'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM