我正在尝试按照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的所有知识,但我在这里学习的速度有点慢。
答案 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