我开发自己的用户提供商。为了检索用户,我已经注入了我的UserRepository:
app_bundle.api_key_user_provider:
class: AppBundle\Security\User\ApiKeyUserProvider
factory: ["@doctrine.orm.entity_manager", "getRepository"]
arguments:
- AppBundle\Entity\User
我还将EntityManager添加到我的提供者的__construct()
方法中:
class ApiKeyUserProvider implements UserProviderInterface
{
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function loadUserByUsername($email)
{
$user = $this->em->findBy(array('email' => $email));
if (!$user) {
throw new UsernameNotFoundException('User not found!');
}
$this->user = $user;
return $user;
}
public function refreshUser(UserInterface $user)
{
return $user;
}
public function supportsClass($class)
{
return $class === 'AppBundle\Entity\User';
}
}
但是当调用Provider时,我得到了下一个错误:
捕获致命错误:参数1传递给 Symfony的\分量\安全\核心\认证\供应商\ DaoAuthenticationProvider的时候:: __结构() 必须实现接口 Symfony \ Component \ Security \ Core \ User \ UserProviderInterface,实例 给出的AppBundle \ Repository \ UserRepository
我试图注入Symfony\Component\Security\Core\User\UserProviderInterface
,但没有成功。我将参数传递给services.yml
提供者定义下一个字符串:
此外,我在SecurityBundle中搜索了所需的服务,但一无所获。
我的问题:我如何向Symfony\Component\Security\Core\User\UserProviderInterface
注入ApiKeyUserProvider
或我还能做些什么来解决这个问题?
非常感谢您的帮助!
答案 0 :(得分:1)
您的ApiKeyUserProvider
期望EntityManager成为依赖项。在这种情况下,您的服务定义是错误的 - 只需将其放入services.yml
app_bundle.api_key_user_provider:
class: AppBundle\Security\User\ApiKeyUserProvider
arguments: ["@doctrine.orm.entity_manager"]
这也需要在您的课程中进行一些调整,因为EntityManager
在您尝试使用时没有findBy
方法。所以你需要改变
$user = $this->em->findBy(array('email' => $email));
到
$user = $this->em->getRepository('AppBundle:User')->findBy(array('email' => $email));
编辑:根据您的评论,我假设您要注入UserRepository
,而不是整个EntityManager
。为此,您应将UserRepository
定义为服务并将其注入您的班级。
<强> services.yml 强>
app_bundle.user_repository:
class: Doctrine\ORM\EntityRepository
factory: ["@doctrine.orm.entity_manager", getRepository]
arguments:
- AppBundle\Entity\User
app_bundle.api_key_user_provider:
class: AppBundle\Security\User\ApiKeyUserProvider
arguments: ["@app_bundle.user_repository"]
<强> ApiKeyUserProvider 强>
class ApiKeyUserProvider implements UserProviderInterface
{
public function __construct(UserRepository $repository)
{
$this->repository = $repository;
}
public function loadUserByUsername($email)
{
$user = $this->repository->findBy(array('email' => $email));
}
}