Doctrine2实体管理器无法在命名空间中找到Custom Repository Class

时间:2016-01-12 12:54:33

标签: php symfony doctrine-orm pagination

我使用Doctrine2 ORM进行Silex设置。我正在尝试构建一个可以与我的实体一起使用的分页类。我很清楚Doctrine2中存在的现有分页类,但因为这个项目是我学校的研究,我正在尝试自己创建这个组件。

以下是访问此页面时遇到的致命错误:

  

致命错误:Class' PlayGround \ Model \ Helper \ UserRepository'在第689行的D:\ web \ playground-solutions \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ EntityManager.php中找不到

我已经使用两个方法count和paginate定义了一个名为 PaginateableInterface 的接口。我接着定义了一个扩展 Doctrine \ ORM \ EntityRepository 的自定义 EntityRepository 类。下面是我的自定义EntityRepository。

<?php

 namespace PlayGround\Service\Doctrine;

 use Doctrine\ORM\EntityRepository as ParentEntityRepository;

 class EntityRepository extends ParentEntityRepository{

   public function count(){

      $em       = $this->getEntityManager();

      $builder  = $em->createQueryBuilder();
      /**
      * ToDo: @entity
      *
      * Still need to find a better way of getting entity class name.
      */
      $entity   = $em->getClassMetadata(get_class(__CLASS__))->getName();

      //Dynamically get a count of records on any entity we happen to call this on.
      $builder->select($builder->expr()->count('e'))
       ->from($entity, 'e');

      $query   = $builder->getQuery();

      //Try-Catch block ommitted
      return $query->getSingleScalarResult();
    }
  }

 <?php

   namespace PlayGround\Model\Helper;

   use PlayGround\Service\Doctrine\EntityRepository as CustomRepository;
   use PlayGround\Contract\PaginateableInterface as IPaginate;

   class UserRepository extends CustomRepository  implements IPaginate
   {
    }

根据我的理解,这应该足够了,因为count和paginate方法位于自定义存储库中。

在我的Paginator类中,我调用我要分页的实体,如下所示:

<?php

  //Paginator class
  $model = $this->getModel($model);
  //Count should be inherited from CustomRepository aliased object.
  $totalRecords = $model->count(); 

下面是关于此问题的另一个问题,我在模型中添加了一个注释,指出它应该使用的存储库类。

<?php
  namespace Application\Model\Entity;

  use Doctrine\ORM\Mapping as ORM;
  use Application\Model\Entity\UserGroup;


 /**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Entity(repositoryClass="PlayGround\Model\Helper\UserRepository")
 */
 class User{ /* Rest of the code goes here... */ }

考虑到所有这些设置,我可以错过什么让它工作?我甚至在我的学说控制台上运行了两个命令,但这也没有帮助。

Luyanda.Siko@ZACT-PC301 MINGW64 /d/web/playground-solutions
$ php app/Console/bin/doctrine.php orm:clear-cache:metadata
  Clearing ALL Metadata cache entries
  Successfully deleted cache entries.

Luyanda.Siko@ZACT-PC301 MINGW64 /d/web/playground-solutions
$ php app/Console/bin/doctrine.php orm:clear-cache:query
  Clearing ALL Query cache entries
  Successfully deleted cache entries.

编辑:

以下是我在D:\ web \ playground-solutions。

中找到的文件结构

enter image description here

3 个答案:

答案 0 :(得分:1)

您声明了两次@ORM\Entity。一次使用repositoryClass,一次不使用@ORM\Entity 。删除没有的那个:

@ORM\Entity(repositoryClass="PlayGround\Model\Helper\UserRepository")

并留下:

@ORM\HasLifecycleCallbacks

()应声明不带括号EntityRepository ...

还要确保PlayGround\Model\Helper\UserRepository位于正确的命名空间和相应的文件夹中:

您的命名空间为PlayGround\Model\Helper,表示该文件应位于文件夹UserRepository.php中,类文件名应为UserRepository

修复并检查它是否仍然无法发表评论。

UPDATE:

您的app位于错误的模块中。现在位于PlayGround的{​​{1}}

答案 1 :(得分:1)

该文件应位于:

src/PlayGround/Model/Helper/UserRepository.php

这就是问题所在。

答案 2 :(得分:0)

显然,这确实耗费了我的思维过程。正如@Witt指出的那样,我所做的只是指向一个不正确的命名空间。

我更改了用户实体中的注释条目,错误消失了。

 <?php
   /** @ORM\Entity(repositoryClass="Application\Model\Helper\UserRepository") */

谢谢你们。