Платформа Symfony API. Как правильно вставлять сложные данные?

У меня есть сущности Продукт и Хост

Продукт

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

Хозяин

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

Когда я добавляю продукт, мне нужно создать хост (из url), если у меня его еще нет, и подставить идентификатор в host_id

Например, я отправляю данные о продукте

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

Те. перед созданием продукта мне нужно создать хост (example2.com). А затем вставьте id в host_id в Product.

Как и где правильно создать Host?

В таком случае мне нужно создать продукт и хост в контроллере?


person Billizzard    schedule 08.12.2018    source источник


Ответы (1)


Вы можете создать Site при отправке данных:

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

Api-платформа должна создать хост, если объекты определены правильно и свойство host доступно для записи.


Или вы можете использовать прослушиватель событий Doctrine, для этого он будет запущен автоматически, когда будет создан Product.

Создайте класс подписчика:

// 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.event_subscriber:

    App\EventListener\ProductListener:
        tags:
            - { name: doctrine.event_subscriber }
person A.L    schedule 08.12.2018