Не следует использовать логику для извлечения преимуществ внутри сущности Book
, особенно если она включает внешние зависимости, такие как entityManager
.
Возможно, вы могли бы использовать события Доктрины, чтобы достичь этого. Получите преимущества после загрузки сущности Book
из БД. Сохраните преимущества до или после сохранения объекта Book
в БД.
Подробнее об этом можно узнать здесь https://symfony.com/doc/current/doctrine/event_listeners_subscribers.html
class Book
{
...
public $benefits;
}
// src/EventListener/RetrieveBenefitListener.php
namespace App\EventListener;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use App\Entity\Book;
class RetrieveBenefitListener
{
public function postLoad(LifecycleEventArgs $args)
{
$entity = $args->getObject();
// only act on some "Book" entity
if (!$entity instanceof Book) {
return;
}
// Your logic to retrieve the benefits
$entity->benefits = methodToGetTheBenefits();
}
}
// src/EventListener/SaveBenefitListener.php
namespace App\EventListener;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use App\Entity\Book;
class SaveBenefitListener
{
public function postUpdate(LifecycleEventArgs $args)
{
$entity = $args->getObject();
// only act on some "Book" entity
if (!$entity instanceof Book) {
return;
}
// Your logic to save the benefits
methodToSaveTheBenefits($entity->benefits);
}
}
// services.yml
services:
App\EventListener\RetrieveBenefitListener:
tags:
- { name: doctrine.event_listener, event: postLoad }
App\EventListener\SaveBenefitListener:
tags:
- { name: doctrine.event_listener, event: postUpdate }
Это всего лишь пример, я не проверял код. Вам, вероятно, придется добавить логику для события postPersist
, если вы создаете новые объекты Book
.
В зависимости от логики получения преимуществ (еще один вызов БД - загрузка из внешнего API?), Вы можете по-разному подходить к проблеме (кэширование, загрузка их в вашу БД с помощью задания cron, ...)