Работа с Doctrine ORM: Пользовательские репозитории?

У меня есть около 10 сущностей: \App\Entity\User, \App\Entity\Group,…


Для каждой из них есть свои репозитории: \App\Repository\UserRepository,… В каждом с дюжину методом.


В Доктрине для доступа к ним используется метод:
$userRepository = $em->getRepository('App\Entity\User');



Однако это не удобно, т.к. пропадает code completion.


Вопрос: как правильно организовать работу с репозиториями, не увеличив статическую связность кода?

Стоит ли использовать статический get метод?
class UserRepository extends EntityRepository
{
    /**
     * @static
     * @return \App\Repository\UserRepository
     */
    public static function get()
    {
        $em = \Registry::getInstance()->get('em');
        return $em->getRepository('App\Entity\User');
    }
}



Смотрел как реализована работа с доктриной в симфонии, но там та же проблема с code completion.
  • Вопрос задан
  • 3223 просмотра
Пригласить эксперта
Ответы на вопрос 4
@nekufa
Если мне нужен код комплит, то можно добавить строчку

use App\Repository\UserRepository;

$userRepository = $em->getRepository('App\Entity\User');
$userRepository instanceof UserRepository;
Ответ написан
casey
@casey
Тоже мучался подобной проблемой — однако так и не нашел красивого решения. Статический метод — не слишком хорошо, комментарии — тоже, instanceof засоряет код. Остановился на комментариях как предложил .
Ответ написан
patashnik
@patashnik
Методы в контроллере?

// somewhere in controller
private function getEntityManager()
{
    return \Registry::getInstance()->get('em');
}
/**
 * @return \App\Repository\UserRepository
 */
private function getUserRepository()
{
    return $getEntityManager()->getRepository('App\Entity\User');
}
Ответ написан
@kastigar
Не вижу ничего плохого в статическом get методе. ИМХО, в вашем случае — это самый лучший вариант:
— по производительности не должно уступать или сильно уступать прямому доступу через EM
— не нужно переживать о захламлении кода
— доступность метода из любых скриптов/классов

Да, PHP такой язык, code completion очень часто не доступен. Лично я часто использовал instanceof как временное решение. Т.е. как только нужен completion, я добавляю instanceof. После того как ф-ция дописана, я его убираю. Не самое идеальное решение, но в большинстве случаев хватало. Для репозиториев доктрины делал бы с помощью статического get метода.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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