4.5 Изменение местоположения классов репозитория

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

/**
* @ORM\Entity(repositoryClass="Acme\StoreBundle\Entity\Repository\ProductRepository")
*/

Сам файл репозитория выглядит следующим образом:

// src/Acme/StoreBundle/Entity/Repository/ProductRepository.php

namespace Acme\StoreBundle\Entity\Repository;

use Doctrine\ORM\EntityRepository;

class ProductRepository extends EntityRepository {

    public function findOneProductById($id) {
        $query = $this->getEntityManager()->createQuery(
            'SELECT p FROM AcmeStoreBundle:Product p WHERE p.id = :id'
        )->setParameter('id',$id);

        try {
            return $query->getSingleResult();
        } catch(\Doctrine\ORM\NoResultExcetion $e) {
            return null;
        }
    }
}

Теперь данный метод доступен в контроллерах:

$products = $em->getRepository('AcmeStoreBundle:Product')->findAllOrderedByName();

Также в классах репозитория имеется связка с UnitOfWork.

$this->matching(Criteria ::create()->where());