Symfony2如何将UserProviderInterface注入服务? (或将UserRepository注入UserProvider的正确方法)

时间:2015-11-24 13:54:19

标签: security symfony

我开发自己的用户提供商。为了检索用户,我已经注入了我的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提供者定义下一个字符串:

  1. Symfony \ Component \ Security \ Core \ User \ UserProviderInterface(得到错误“类不存在”)
  2. 供应商\ Symfony \ Component \ Security \ Core \ User \ UserProviderInterface(出现相同错误)
  3. 此外,我在SecurityBundle中搜索了所需的服务,但一无所获。

    我的问题:我如何向Symfony\Component\Security\Core\User\UserProviderInterface注入ApiKeyUserProvider或我还能做些什么来解决这个问题?

    非常感谢您的帮助!

1 个答案:

答案 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));
    }
}