@symnoob

Symfony — Repository Как избежать двойного кода в этом случае?

Всем привет,
Как избежать двойного кода в этом случае?

В каждом Repository имеется этот код, только разумеется тайп-хинтинг всегда разный

public function save(User $user): void
    {
        $this->getEntityManager()->persist($user);
        $this->getEntityManager()->flush();
    }


хотелось бы создать какой нибудь абстрактный класс для этого дела, но как быть с тайп-хинтингом?
  • Вопрос задан
  • 159 просмотров
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
flush() нужно вынести, потому что вы можете заперсистить 100 объектов и сделать один flush — одна череда обращений к Бд. В вашем же случае будет 100 и более обращений к БД

Чтобы сделать универсальный метод для персиста в репозиториях, раз уж вы решили так делать (многие считают это верным) — можно сделать универсальный код (трейт к примеру), в котором будет проверка через classMetadata, что сохраняемый объект нужного типа для репозитория (тут не забываем про наследование сущностей, is_a()и вот это все) и если придет не тот объект — кидать InvalidArgumentException

НО! Если вы репозитории размещаете в своем домене/пакете/неймпсейсе, то вам не избежать дублирования кода, и это не так уж и страшно... Связанность и паутина наследований страшнее. Репозиториев все равно мало во всем коде относительно всей базы кодовой.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы