Платформа Symfony API.Как правильно вставить сложные данные? - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть сущности Product и Host

Product

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

Host

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 09 декабря 2018

Вы можете создать 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 }
...