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 }
我有实体产品和主机
产品
-------------------------------------------------
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 }