пользовательский класс репозитория в symfony2

Я новичок в symfony2.I создал класс репозитория, когда я создал класс сущности через командную строку. Но я не смог получить доступ к своим пользовательским функциям в этом классе репозитория. как создать пользовательский класс репозитория в symfony2? Может ли кто-нибудь дать мне пошаговое объяснение с нуля с некоторым примером кода?

Ниже мой класс хранилища

namespace Mypro\symBundle\Entity; use Doctrine\ORM\EntityRepository; /** * RegisterRepository * This class was generated by the Doctrine ORM. Add your own custom * repository methods below. */ class RegisterRepository extends EntityRepository { public function findAllOrderedByName() { return $this->getEntityManager() ->createQuery('SELECT p FROM symBundle:Register p ORDER BY p.name ASC') ->getResult(); } } 

Я так позвонил своему контроллеру

 $em = $this->getDoctrine()->getEntityManager(); $pro = $em->getRepository('symBundle:Register') ->findAllOrderedByName(); 

Я получил следующую ошибку

 Undefined method 'findAllOrderedByName'. The method name must start with either findBy or findOneBy! 

Есть ли у меня ошибка в коде? Любая ошибка при создании класса репозитория? мне нужно было использовать любой класс.

Я думаю, вы просто забыли зарегистрировать этот репозиторий в своей организации. Вам просто нужно добавить в свой файл конфигурации сущности класс репозитория.

В src / Mypro / symBundle / Resources / config / doctrine / Register.orm.yml:

 Mypro\symBundle\Entity\Register: type: entity repositoryClass: Mypro\symBundle\Entity\RegisterRepository 

Не забудьте очистить кеш после этого изменения, на всякий случай.

И если вы используете аннотации (вместо yml config), вместо этого добавьте что-то вроде:

 /** * @ORM\Entity(repositoryClass="Mypro\symBundle\Entity\RegisterRepository") */ 

вашему классу Entity для регистрации репозитория

В руководстве есть пошаговое руководство … http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes

  • Сначала определите класс репозитория в конфигурации аннотации / yaml
  • Создать класс
  • Создать функцию
  • Затем вызовите вновь созданную функцию ….

Я тоже потерял много времени, когда попал в этот беспорядок конфигурации. Я настраивал класс репозитория в моем Entity как сопоставление аннотаций. Отображение было там, но все же репозиторий не был связан с объектом. Когда я переместил отображение аннотации, то есть @ORM \ Entity (репозиторийClass = «Acme \ DemoBundle \ Entity \ UserRepository»), он работал до последней строки.

  /* * User * * @ORM\Table() * @ORM\Entity(repositoryClass="Acme\DemoBundle\Entity\UserRepository") */ class User { ... }` 

xml для сопоставления: обновить файл сопоставления xml в папке Resource / config / doctrine, добавить атрибут класса репозитория:

 <entity name="Ccd\Bundle\FrontendBundle\Entity\UvUpdatePageContent" table="uv_update_page_content" repository-class="Ccd\Bundle\FrontendBundle\Entity\UvUpdatePageContentRepository"> 

http://doctrine-mongodb-odm.readthedocs.org/en/latest/cookbook/mapping-classes-to-orm-and-odm.html Затем обновить кеш:

 php app/console doctrine:cache:clear-metadata php app/console cache:clear 

Прежде всего, для этого вам не требуется настраиваемое репо. Вы можете установить порядок order by в методе find get get: GetRepository:

 //$em - entity manager //from Doctrine documentation: findBy(criteria(array), order(array), limit, offset) $result = $em->getRepository('symBundle:Register')->findBy(array(), array('name' => 'ASC')) 

Я просто перехожу к документу документации по исходным документам и просматриваю аннотацию, которую я выбрал. Например, я выбрал yaml, добавил конфигурации в файлы Product.orm.yml и Category.orm.yml, а также добавит новые атрибуты php в Entity Methods:

 protected $products; public function __construct() { $this->products = new ArrayCollection(); } 

для Category.php и

 protected $category; 

для Product.php

затем запустите php app/console doctrine:generate:entities Acme , которые успешно добавляют новые геттеры и сеттеры