Как расширить EntityRepository в Symfony2? - PullRequest
5 голосов
/ 12 февраля 2012

У меня есть эта проблема. У меня есть метод, который повторяется во всех репозиториях, например, этот метод.

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, поэтому, пожалуйста, извините, если я обидел ваши чувства своей неосведомленностью.

1 Ответ

13 голосов
/ 12 февраля 2012

Это больше 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 {}

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

public function __construct($em, Mapping\ClassMetadata $class)
{
    parent::__construct($em, $class);
    // some extra stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...