2012-02-12 3 views
4

У меня эта проблема У меня есть метод, повторяющийся во всех хранилищах, например, этот метод.Как расширить EntityRepository в Symfony2?

function getAllOrderedBy($column) { 

    $qb = $this->createQueryBuilder('ac') 
      ->select('ac') 
      ->orderBy('ac.' . $column); 

    return $qb->getQuery()->getResult(); 
} 

Я хочу, чтобы извлечь его в другом суперкласса, OrderedRepository, например, и использовать его в качестве базового класса для всех других хранилищ.

Теперь проблема в том, как это сделать?

Я попытался создать экземпляр EntityRepository в конструкторе OrderedRepository, что-то вроде этого, но также создавал там все внутренние объекты, необходимые для других вещей, но это действительно не сработало, и я чувствовал, что это неправильно путь к следующему.

function __construct() { 

    parent::__construct(); 
    $this->blabla_option = "instantiated"; 
} 

Не могли бы вы привести пример правильно простирающийся от EntityRepository, чем этот расширенный класс может служить в качестве базового класса для других хранилищ?

P.S. Я начинаю на PHP, поэтому, пожалуйста, извините меня, если я причиняю вам свои чувства своей неосознанностью.

ответ

12

Это больше вещь Doctrine2.

Предполагая, что вы используете аннотации для отображения доктрины, вы должны объявить, какой репозиторий класса вы используете в Entity:

/** 
* @ORM\Entity(repositoryClass="Fully\Qualified\Namespace\To\MyRepository") 
*/ 
class MyEntity { } 

, как описано здесь: http://symfony.com/doc/2.0/book/doctrine.html#custom-repository-classes.

Затем вы можете закодировать этот пользовательский класс MyRepository, используя стандартное наследование класса.

Вы можете себе представить что-то подобное:

class OrderedRepository extends EntityRepository 
{ 
    // some extra methods... 
} 

class MyRepository extends OrderedRespository {} 

Наконец, если вы хотите, чтобы переопределить __constructor вашего репозитория, вы иметь в initailize родительский конструктор с теми же аргументами:

public function __construct($em, Mapping\ClassMetadata $class) 
{ 
    parent::__construct($em, $class); 
    // some extra stuff 
} 
+0

Catchable Fatal Error: аргумент 2 передан в OrderedRepository :: __ construct() должен быть экземпляром метаданных \ ClassMetadata, экземпляром Doctrine \ ORM \ Mapping \ ClassMetadata, указанным в ... vendor \ doctrine \ lib \ Doctrine \ ORM \ EntityManager.php on li ne 578 и определен в строке OrderedRepository.php 18 строка 18: публичная функция __construct ($ em, ClassMetadata $ class) – Monomachus

+0

Вы должны добавить соответствующие ** ** инструкции ** поверх своего класса или набрать текст полностью квалифицированных пространств имен. Например: public function __construct ($ em, Doctrine \ ORM \ Mapping \ ClassMetadata $ class) – Florian

+0

Да, спасибо, это сработало, хотя теперь мне нужно реализовать конструктор в каждом репозитории, который ставит перед собой первоначальную цель :( – Monomachus

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