В настоящее время я работаю с частью 4 Symfony в проекте SymBlog. Я получаю сообщение ERROR:
Undefined method 'getLatestPosts'. The method name must start with either findBy or findOneBy!500 Internal Server Error - BadMethodCallException
Это мой класс PostRepository:
<?php namespace BLog\BlogBundle\Entity; use Doctrine\ORM\EntityRepository; class PostRepository extends EntityRepository { public function getLatestPosts($limit = null) { $qp = $this->createQueryBuilder('p') ->select('p') ->addOrderBy('p.created', 'DESC'); if (false === is_null($limit)) { $qp->setMaxResults($limit); } return $qp->getQuery() ->getResult(); } }
Это страница контроллера. Метод действия:
<?php namespace Blog\BlogBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class DefaultController extends Controller { public function indexAction() { $em = $this->getDoctrine() ->getEntityManager(); $posts = $em->getRepository('BlogBundle:Post') ->getLatestPosts(); return $this->render('BlogBundle:Default:home.html.twig', > >array( 'posts' => $posts )); } ... }
Это образец моего кода ../../../Entity/Post:
<?php namespace Blog\BlogBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Entity(repositoryClass="Blog\BlogBundle\Entity\PostRepository") * @ORM\Table(name="post") * @ORM\HasLifecycleCallbacks */ class Post { .... ... .. /** * @ORM\Column(type="text") */ protected $post; ... ...
Я также пробовал все решения в этой статье от ScoRpion
Что здесь ПРОБЛЕМА ???
Проверьте это:
$posts = $em->getRepository('BlogBundle:Post') ->getLatestPosts();
Это должно быть
$posts = $em->getRepository('BlogBlogBundle:Post') ->getLatestPosts();
Посмотрите свое пространство имен.
Удаление полного пути к репозиторию из аннотации класса Entity работает для меня: @ORM\Entity(repositoryClass="AdvertRepository")
Я не понимаю, почему, хотя …
Для меня решение заключалось в том, чтобы поместить только имя репозитория без полного пути к нему.
Была (ошибка):
* @ORM\Entity(repositoryClass="OC\PlatformBundle\Repository\AdvertRepository")
Должен быть (работает):
* @ORM\Entity(repositoryClass="AdvertRepository")
Решение заключалось в том, чтобы поместить класс репозитория внутри каталога Entity рядом с Post Entity, и теперь это класс Entity:
<?php namespace Blog\BlogBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Entity(repositoryClass="PostRepository") * @ORM\Table(name="post") * @ORM\HasLifecycleCallbacks */ class Post { .... ... .. /** * @ORM\Column(type="text") */ protected $post; ... ...