@hiwibu

Как вызвать репозиторий в symfony 2?

Делаю пример из доки. Есть сущность и репозиторий, все сгенерино через консоль.
Вызываю
$org = $this->getDoctrine()
            ->getRepository('MyOrgBundle:Organization')
            ->find(21);


пишет
Fatal error: Call to undefined method My\OrgBundle\Entity\Organization::find()


По идее он должен OrganizationRepository искать, т.к. там метод find(), но почему-то берет Entity

upd

с User работает
public function indexAction()
    {
        $org = $this->getDoctrine()
            ->getRepository(User::class)
            ->find(24);
        
        return array('name' => 'hdf');
    }


а вот так - нет
public function indexAction()
    {
        $org = $this->getDoctrine()
            ->getRepository(Organization::class)
            ->find(24);
        
        return array('name' => 'hdf');
    }


перегенерировал. имена проверил. все тоже самое
  • Вопрос задан
  • 896 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
1) Что-то мне подсказывает что валится оно на чем-нибудь вроде $product->find() а не на том что вы привели.

2) Лучше делать так

$this->get('doctrine.orm.entity_manager')->getRepository(Organization::class)


3) А еще лучше регистрировать репозитории как сервисы

4) А еще лучше, не наследоваться от доктриновский репозиториев и использовать свои, которым в конструктор передавать entity manager и там уже делать что душе вздумается. Пример (так как это должно быть, в реальных проектах можно упрощать)

class DoctrineOrganizationRepository implements OrganizationRepository 
{
    private $em;
    public function __construct(EntityManagerInterface $em) 
    {
          $this->em = $em;
    }

    public function getOrganization(int $id) : Organization
    {
           $organization = $this->em->find(Organization::class, $id);
           if (!$organization) {
                 throw new OrganizationNotFoundException();
           }
 
           return $organization;
    }
}


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

services:
     organization_repository:
         class: MyApp\Service\Doctrine\DoctrineOrganizationRepository
         autowire: true


5) Не дробите приложение на бандлы. Они для того что бы реюзать код. Если вы дробите систему на бандлы с мыслью "может потом реюзаю" - это пример преждевременной оптимизации. Вам нужен только AppBundle и то только ради маленьких шорткатов.

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

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

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