@symnoob

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

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

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

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


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

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

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

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

Войти через центр авторизации
Похожие вопросы