Как создавать пользовательские классы хранилища

Как создавать пользовательские классы хранилища

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

Чтобы сделать это, добавьте имя класса хранилища к определению отображени вашей сущности:

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    // src/AppBundle/Entity/Product.php
    namespace AppBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @ORM\Entity(repositoryClass="AppBundle\Repository\ProductRepository")
     */
    class Product
    {
        //...
    }
    
  • YAML
    1
    2
    3
    4
    5
    # src/AppBundle/Resources/config/doctrine/Product.orm.yml
    AppBundle\Entity\Product:
        type: entity
        repositoryClass: AppBundle\Repository\ProductRepository
        # ...
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- src/AppBundle/Resources/config/doctrine/Product.orm.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
            http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
    
        <entity
            name="AppBundle\Entity\Product"
            repository-class="AppBundle\Repository\ProductRepository">
    
            <!-- ... -->
        </entity>
    </doctrine-mapping>
    

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

1
$ php bin/console doctrine:generate:entities AppBundle

Tip

Если вы решите создавать классы хранилищ самостоятельно, они должны расширять Doctrine\ORM\EntityRepository.

Далее, добавьте новый метод - findAllOrderedByName() - к свежесгенерированному классу ProductRepository. Этот метод будет запрашивать все сущности Product, упорядоченные в алфавитном порядке.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// src/AppBundle/Repository/ProductRepository.php
namespace AppBundle\Repository;

use Doctrine\ORM\EntityRepository;

class ProductRepository extends EntityRepository
{
    public function findAllOrderedByName()
    {
        return $this->getEntityManager()
            ->createQuery(
                'SELECT p FROM AppBundle:Product p ORDER BY p.name ASC'
            )
            ->getResult();
    }
}

Tip

Доступ к менеджеру сущностей можно получить через $this->getEntityManager() изнутри хранилища.

Вы можете использовать этот новый методы так же, как и стандартные поисковые методы хранилища:

1
2
3
4
5
6
7
8
use Doctrine\ORM\EntityManagerInterface;
// ...

public function listAction(EntityManagerInterface $em)
{
    $products = $em->getRepository('AppBundle:Product')
        ->findAllOrderedByName();
}

Note

При исползовании пользовательского класса хранилища, у вас всё равно будет доступ к поисковым методам, как find() и findAll().

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.