Symfony2 и избегать слишком многословного кода
В большинстве моих контроллеров мне нужно получить ссылку на один или несколько моих пользовательских репозиториев, поэтому, естественно, я делаю это много:
/** @var $repo MyFirstEntityRepository */
$repo1 = $this->getDoctrine()->getManager()->getRepository('MyNamespaceMyBundle:MyFirstEntity');
/** @var $repo MySecondEntityRepository */
$repo2 = $this->getDoctrine()->getManager()->getRepository('MyNamespaceMyBundle:MySecondEntity');
/** @var $repo MyThirdEntityRepository */
$repo3 = $this->getDoctrine()->getManager()->getRepository('MyNamespaceMyBundle:MyThirdEntity');
У меня такой вопрос: если у меня есть несколько разных сущностей, для которых мне нужна ссылка на репозиторий, целесообразно ли создавать группу соответствующих get[EntityName]Repository
методы в некотором роде BaseController
от которого все другие контроллеры могут наследовать?
Реорганизованный код контроллера будет больше похож на:
$repo1 = $this->getMyFirstEntityRepository();
$repo2 = $this->getMySecondEntityRepository();
$repo3 = $this->getMyThirdEntityRepository();
Что бы хорошо сочеталось с автозаполнением IDE и выводом типа.
Это хорошая практика? Или это нарушает какой-то стандарт? Это делает код менее "слабо связанным"?
2 ответа
Как насчет этого?
$em = $this->getDoctrine()->getManager();
/** @var $repo MyFirstEntityRepository */
$repo1 = $em->getRepository('MyNamespaceMyBundle:MyFirstEntity');
/** @var $repo MySecondEntityRepository */
$repo2 = $em->getRepository('MyNamespaceMyBundle:MySecondEntity');
/** @var $repo MyThirdEntityRepository */
$repo3 = $em->getRepository('MyNamespaceMyBundle:MyThirdEntity');
Мне кажется объявление переменной $em
решает все СУХИЕ нарушения...
Я бы предложил подход Model Manager. Затем вы можете, в свою очередь, использовать JMSDiExtraBundle, чтобы сделать создание еще проще.
Примечание. Если вы используете Symfony 2.2, то, вероятно, у вас уже установлен JMSDiExtraBundle, так как он был частью стандартного дистрибутива в этой версии.