2014-02-12 2 views
5

Как новичок в Symfony2 & доктрины я борюсь (в пользовательском классе репозитория) с разницей между getEntityManager() и getManager().getManager вызывает ошибку, getEntityManager работает нормально?

Я знаю getEntityManager() является устаревшим, но если я использую getManager() вместо этого, я получаю «Название метода Неопределенный метод„getManager“должен начинаться с findBy или findOneBy!»

В моем классе, следующий код работает:

public function haalidop($verbid) 
{ 
    return $this->getEntityManager() 
       ->createQuery('SELECT p FROM myBundle:Verbs p WHERE p.verbid='.$verbid) 
       ->getSingleResult(); 
} 

Если изменить (обновить?) Это как код ниже, я получаю ошибку ...

public function haalidop($verbid) 
    { 
     return $this->getManager() 
        ->createQuery('SELECT p FROM myBundle:Verbs p WHERE p.verbid='.$verbid) 
        ->getSingleResult(); 
    } 

Любой любой подскажите, что здесь не так?

ответ

11

getEntityManager метод Registry является устаревшим. Поскольку вы находитесь в репозитории, вы расширили не реестр, а EntityRepository. Этот класс имеет только метод getEntityManager, который не устарел.

Причина этого несоответствия довольно проста: реестр - это то, что используется и для другой библиотеки Doctrine, например, ODM. Они не используют имя «Сущность», но «Документ». По этой причине использование Oне имело большого смысла для ODM, поэтому они изменились, если на getManager.
С другой стороны, EntityRepository, поскольку его имя уже сообщает нам, имеет значение ORM, что означает, что пользователей ODM не путают (они используют другой класс репозитория).

+0

Хорошее объяснение. Это, в конце концов, имеет смысл для меня. – ferdynator

+1

Хорошо, хороший комментарий, спасибо! Возможно, это можно улучшить на панели инструментов отладки Symfony2. Если вы получаете getEntityManager(), он всегда говорит: «DEPRECATION - getEntityManager устарел с Symfony 2.1. Вместо использования getManager ' – PBR

+1

@PBR вы уверены, что это код, о котором говорит панель инструментов отладки? Эти устаревания вылавливаются только при возникновении ошибки E_USER_DEPRECATED, это не относится к методу репозитория # getEntityManager. –

-1

, если в контроллере:

$this->get('doctrine')->getManager(); 

, если в службе:

$this->container->get('doctrine')->getManager(); 
+1

Пожалуйста, не защищайте инъекции контейнера в сервисе, а только заказывайте службы, которые вам нужны в службе. –

+0

@WouterJ, точно, насколько более дорогостоящим является его введение в контейнер? –

+0

Речь идет не о времени, а о архитектуре. Впрыскивание контейнера делает невозможным использование инъекции. Фактически, он называется антипаттером Service Locator. Попробуйте Google для этого, вы найдете много объяснений, почему вы должны избегать этого шаблона. –

1

Метод getEntityManager по-прежнему действует в репозиториях, как вы можете видеть в current docs. Он устарел в контроллерах, хотя вместо этого следует использовать метод getManager.

Смежные вопросы