1

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

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

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

这条线似乎对我不利:

  @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 的一切,但我在这里学得有点慢。

4

2 回答 2

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

于 2012-06-11T11:11:07.577 回答
0

您应该能够使用该doctrine:generate:entities命令生成正确的类。(书中记载。)

我认为您的命令应如下所示:

php app/console doctrine:generate:entities User
于 2012-06-11T11:00:53.397 回答