使用带有FOSUserBundle的自定义实体存储库

时间:2014-09-17 20:04:24

标签: php symfony repository entity fosuserbundle

我已将FOSUserBundle添加到我的应用中,并希望使用我自己的实体存储库。

我的应用包含多个实体;用户,工作,文件和评论。由于我已经添加了FOSUserBundle,我已经能够重新映射所有内容,因此用户/ jobs / files / comments都按照应有的方式链接,但我在分析器中注意到查询的数量已经增加。

例如 - 要显示用户配置文件页面,现在单独查询数据库以获取用户信息,与该用户相关的作业以及与这些作业相关的注释。以前,一个查询将使用我的存储库中的查询获得所有信息。

由于showAction控制器现在由FOSUserBundle提供,我的存储库未被使用。

除了覆盖控制器(这对于我想要做的事似乎有些过分)之外,还有其他任何方式来调用我自己的存储库吗?

编辑:添加实体代码:

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity(repositoryClass="Test\TestBundle\Entity\Repository\TestUserRepository")
* @ORM\Table(name="users")
* @ORM\HasLifeCycleCallbacks
*/
class TestUser extends BaseUser
{
    // entity defintitions...
}

存储库代码(我以前在我的showAction方法中调用并希望现在仍然使用):

use Doctrine\ORM\EntityRepository;

class TestUserRepository extends EntityRepository
{
    public function getUser($userId)
    {
        $qb = $this->createQueryBuilder('u')
                   ->select('u, j')
                   ->leftJoin('u.jobs', 'j')
                   ->leftJoin('u.files', 'f')
                   ->leftJoin('u.comments', 'c')
                   ->where('u.id = :userId')
                   //->addOrderBy('j.dateCreated', 'ASC')
                   ->setParameter('userId', $userId)
                   ;

        return $qb->getQuery()
                  ->getResult();
    }
}

1 个答案:

答案 0 :(得分:2)

是的,您可以在实体中定义自定义存储库。

/**
 * @ORM\Entity(repositoryClass="Foo\UserBundle\Entity\Repository\UserRepository")
 * @ORM\HasLifecycleCallbacks
 * @ORM\Table(name="user")
 */
class User extends BaseUser
{
  ...
}