Как создать собственные методы для хранилищ Doctrine в Symfony 2

Создание пользовательских запросов с помощью доктрины — обычная ежедневная задача, однако обычно существуют запросы, которые необходимо использовать более одного раза и занимающие более 4 строк кода.

Обычный здравомыслящий разработчик не захочет писать это каждый раз, когда ему нужен этот запрос! По этой причине мы создадим пользовательские методы, потому что, помимо сохранения ненужных строк кода, мы сделаем наш код более удобным для сопровождения и это хорошая практика.

1. Создайте папку для пользовательских методов в комплекте.

Мы собираемся создать папку, которая будет содержать наши классы с настраиваемыми методами для репозиториев, рекомендуется создавать ее в корневой папке вашего пакета (рядом с папками контроллера, сущности, формы). Эта папка будет иметь имя Repository.

2. Создайте класс с пользовательскими методами

Теперь нам нужно создать класс с пользовательскими методами для нашего репозитория, он должен иметь следующую структуру:

getRepository('mybundle:Something')->countSomething();
public function countSomething()
{
return  $this->getEntityManager()
->createQuery('SELECT COUNT(a) FROM myBundle:Something a')
->getSingleScalarResult();
}
}

3. Активируйте репозитории в соответствии с вашим стилем отображения

Как мы все знаем, в Symfony 2 существует несколько способов создания сущностей с доктриной. В зависимости от вашего предпочтительного метода вам нужно будет активировать классы следующим образом:

  • А) Метод аннотации

Мы добавим следующий код в наш файл сущности (для которого мы создаем пользовательские методы):

// The entity should be in : src/myapp/myBundle/Entity/Something.php
/**
* @ORM\Entity(repositoryClass="myapp\myBundle\Repository\mynameRepository")  //Here goes the namespace of our custom methods class with the name of the class in the end (check step 2 namespace)
*/
class Something
{
// ..
}
  • Б) Нет методов аннотации

Найдите отображенный файл orm (обычно в myBundle / ресурсы / конфигурации / Доктрина / myfile.orm.yml) и добавьте строку repositoryClass

myapp\myBundle\Entity\Something: # This already exist
type: entity # This already exist
table: something # This already exist
repositoryClass: myapp\myBundle\Repository\mynameRepository # Add the custom repository class path to the orm.yml file

4) Перестройте сущности

Просто запустите команду доктрины generate: entites для вашего пакета.

php app/console doctrine:generate:entities myBundle

если вы все сделали правильно, вы сможете вызывать ваши собственные методы из вашего хранилища. Если вы используете собственный класс репозитория, у вас все еще есть доступ к методам поиска по умолчанию, таким как find() а также findAll() без проблем.

Ссылка на основную публикацию
Adblock
detector