Symfony2 cookbook从DB教程加载用户 - 缺少存储库类

时间:2012-06-11 10:55:14

标签: php symfony

我正在尝试按照Symfony2 cookbook教程从数据库加载用户。

本教程假设您有一个ACME / UserBundle而我的安装没有,但我只是假设我可以创建自己的(它不像我需要在某处下载的插件包装?)。

我创建了一个捆绑UserBundle并从教程的实体User(第一个代码框here)中复制粘贴代码。

这条线似乎打破了我的想法:

  @ORM\Entity(repositoryClass="Mycompany\UserBundle\Entity\UserRepository")

我得到的错误信息是:

Fatal error: Class 'mycompany\UserBundle\Entity\UserRepository' not
found in /var/www/mycompany/vendor/doctrine/lib/Doctrine/ORM/EntityManager.php
on line 578

所以我要么假设我不能创建自己的UserBundle(奇怪,因为我认为这是一个关于如何做到这一点的教程,而不是如何安装一个插件来做它),或者他们认为我知道我以某种方式需要以某种方式在entityRepositories中注册实体吗?

如果有更高级的symfony能够启发我,我将非常感激。我真的很喜欢到目前为止我所学到的关于Symfony2的所有知识,但我在这里学习的速度有点慢。

2 个答案:

答案 0 :(得分:1)

听起来你没有用户存储库类,这与用户实体类是分开的。它位于实体文件夹中,但是可以是UserRepository.php,如下所示:

namespace Mycompany\UserBundle\Entity;

use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\NoResultException;

// Implements userproviderinterface so we can use the user entity for authentication
// Extends entityrepository so that it gets methods definded there
class UserRepository extends EntityRepository implements UserProviderInterface {

  //  This function is called when a user tries to login, the below lets the user use their username or email for username
  public function loadUserByUsername($username) {
    $user = $this->createQueryBuilder('u')
            ->select('u, r')
            ->leftJoin('u.roles', 'r')
            ->where('u.username = :username OR u.email = :username')
            ->setParameter('username', $username)
            ->getQuery();
    try {
      $user = $user->getSingleResult();
    } catch (NoResultException $exc) {
      throw new UsernameNotFoundException(sprintf('Unable to find an active UserBundle:User object identified by %s', $username));
    }
    return $user;
  }
  // 
  public function refreshUser(UserInterface $user) {
    $class = get_class($user);
    if (!$this->supportsClass($class))
      throw new UnsupportedUserException(sprintf('instances of class %s are not supported', $class));
    return $this->loadUserByUsername($user->getUsername());
  }

  public function supportsClass($class) {
    return $this->getEntityName() === $class || is_subclass_of($class, $this->getEntityName());
  }

}

在您正在进行的教程http://symfony.com/doc/current/cookbook/security/entity_provider.html

中,可以使用此课程

答案 1 :(得分:0)

您应该能够使用doctrine:generate:entities命令生成正确的类。 (Documented in the book.)

我认为你的命令应该是这样的:

php app/console doctrine:generate:entities User