Истинный способ создать расширение для EntityManager - PullRequest
0 голосов
/ 05 декабря 2018

Часто встречается следующий фрагмент кода:

catch (Exception $ex){
    $em->clear();
    if($em->getConnection()->isTransactionActive())
        $em->rollback();
    {somecode}
}

Первая мысль - создать наследник EntityManager, содержащий метод, реализующий очистку и откат, и поместить его в контейнер DI.Но класс Doctrine EntityManager в комментариях помечается как окончательный:

/* final */class EntityManager implements EntityManagerInterface

Помощник как сервис будет уродливым.Есть идеи?

1 Ответ

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

Вы бы вместо этого использовали украшение.Примерно это будет выглядеть примерно так:

class MyEntityManager implements EntityManagerInterface
{
    private $decoratedManager;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->decoratedManager = $entityManager;
    }

    /**
     * Implement all methods on the interface like this:
     */
    public function persist($entity)
    {
        return $this->decoratedManager->persist($entity);
    } 
}

Это не сломает финал, и вы можете легко переопределить функции.Затем в конфигурации вашего сервиса вы должны переписать определение сервиса для менеджера сущностей или убедиться, что всякий раз, когда вы хотите внедрить EntityManagerInterface в сервис, выбирается ваш.

...