Symfony API 平台。如何正确插入复杂数据?

Symfony API Platform. How properly insert complex data?

我有实体产品和主机

产品

-------------------------------------------------
id   host_id           url               name
-------------------------------------------------
1      1    http://example.com/1/2/3   product_1

主持人

----------
id   host   
----------
1    example.com

当我添加产品时,我需要创建一个主机(来自 url),如果我还没有主机并在 host_id

中替换一个 id

例如我发送产品数据

{
    url: http://exmaple2.com/2/3/4
    name: super_product
}

那些。在创建产品之前,我需要创建一个主机 (example2.com)。然后在 Product.

中插入 id 到 host_id

我应该如何以及在何处正确创建主机?

那样的话,需要在controller中创建Product和Host吗?

您可以在发送数据时创建 Site

{
    url: http://exmaple2.com/2/3/4,
    name: super_product,
    host: {"host": "example.com"}
}

Api-平台应该创建主机是正确定义的实体并且 host 属性 是可写的。


或者,您可以为此使用 Doctrine event listener,它会在创建 Product 时自动触发。

创建订阅者class:

// src/EventListener/SearchIndexerSubscriber.php
namespace App\EventListener;

use Doctrine\Common\EventSubscriber;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use App\Entity\Product;
use Doctrine\ORM\Events;

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

    public function postPersist(LifecycleEventArgs $args)
    {
        $entity = $args->getObject();

        if ($entity instanceof Product) {
            // Create site
            $site = new Site();
            // Set data you need
            $site->setUrl(…);
            // Create site
            $entity->setSite($site);

            $entityManager = $args->getObjectManager();
            $entityManager->persist($product);
            $entityManager->flush();
        }
    }
}

您可以在 Doctrine documentation 上找到不同的活动。

使用 doctrine.event_subscriber 标记服务:

    App\EventListener\ProductListener:
        tags:
            - { name: doctrine.event_subscriber }