方法名称必须以findBy或findOneBy开头。 未定义的方法Symfony?
我正在通过Symfony2的part4 ,并更新控制器和帮助类代码,我得到以下错误信息
Undefined method 'getLatestBlogs'. The method name must start with either findBy or findOneBy!
之前,我已经把一些代码在控制器,我转移到我的助手类的教程教导,导致上述错误信息。
<?php // src/Blogger/BlogBundle/Repository/BlogRepository.php namespace Blogger\BlogBundle\Repository; use Doctrine\ORM\EntityRepository; /** * BlogRepository * This class was generated by the Doctrine ORM. Add your own custom * repository methods below. */ class BlogRepository extends EntityRepository { public function getLatestBlogs($limit = null) { $qb = $this->createQueryBuilder('b') ->select('b') ->addOrderBy('b.created', 'DESC'); if (false === is_null($limit)) $qb->setMaxResults($limit); return $qb->getQuery() ->getResult(); } }
这里是我的控制器文件索引行动代码: –
// src/Blogger/BlogBundle/Controller/PageController.php class PageController extends Controller { public function indexAction() { $em = $this->getDoctrine() ->getEntityManager(); $blogs = $em->getRepository('BloggerBlogBundle:Blog') ->getLatestBlogs(); return $this->render('BloggerBlogBundle:Page:index.html.twig', array( 'blogs' => $blogs )); } // .. }
我从/Entity/Blog.php文件附加几行。 请根据您的答案查看它们是否正确。
<?php // src/Blogger/BlogBundle/Entity/Blog.php namespace Blogger\BlogBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository") * @ORM\Table(name="blog") * @ORM\HasLifecycleCallbacks() * @ORM\Entity */ class Blog { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") * @ORM\HasLifecycleCallbacks() */ protected $id; -- -- }
我在哪里做错了?
确保你已经修改你的实体类:
// src/Blogger/BlogBundle/Entity/Blog.php /** * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository") * @ORM\Table(name="blog") * @ORM\HasLifecycleCallbacks() */ class Blog { // .. }
注解@ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
是必需的。
不要忘记重新生成实体:
php app/console doctrine:generate:entities Blogger
UPDATE
删除注释@ORM\Entity
。 它覆盖了正确的注释@ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
在我的情况下,添加适当的注释是不够的。
通过php app/console doctrine:cache:clear-metadata
删除Doctrine Cache php app/console doctrine:cache:clear-metadata
也没有工作。
我通过命令从数据库生成我的实体
php app / console doctrine:映射:import –force AcmeBlogBundle xml
php app / console doctrine:映射:转换注释./src
php app / console doctrine:生成:实体AcmeBlogBundle
第一个命令为我的项目中的每个数据库表生成orm.xml文件。 删除所有orm.xml文件之后注释开始正常工作。
如果您使用yml作为您的实体的configuration文件尝试添加此:
Blogger\BlogBundle\Entity\Blog: type: entity table: Blog repositoryClass: Blogger\BlogBundle\Repository\BlogRepository ...
然后如上所述:
php app/console doctrine:generate:entities Blogger
另一种解决scheme是删除生成实体添加的所有orm.xml文件。 如果您移动文件夹或删除,您与存储库的映射将是可操作的。
如果你正在使用PHP-FPM,那么即使你已经尝试了所有上述解决scheme,然后使用sudo service php5-fpm restart
,这个问题可能会持续下去。
* @ORM\Entity(repositoryClass="Blogger\BlogBundle\Repository\BlogRepository")
尝试将存储库类放在实体类旁边的相同目录中:
* @ORM\Entity(repositoryClass="Blogger\BlogBundle\BlogRepository")
对我来说,这有助于重新启动我的vm(Vagrant Box)