用户存储库类作为用户提供者和依赖注入

时间:2014-05-01 18:46:45

标签: php symfony dependency-injection doctrine-orm api-key

我跟随此tutorial(如何使用API​​密钥验证用户)在我的应用程序中实现api密钥。

我使用我的用户存储库类,该类是基于此tutorial(如何从数据库加载安全用户)创建的,作为预身份验证过程中所需的用户提供程序,因为该类我已经在下面的教程中使用了用户提供程序描述的方法,即loadUserByUsername()refreshUser()supportsClass()

Symfony调用我的apikey_authenticator服务,该服务需要用户提供程序作为参数。因此,我已经配置了另一个名为userprovider的服务,这是我的用户存储库类,如下所示:

services:
apikey_authenticator:
    class: MyBundle\Security\ApiKeyAuthenticator
    arguments: ["@userprovider"]
userprovider:
    class: MyBundle\Entity\UserRepository

但我的用户存储库类依赖于实体管理器,我不知道如何注入。我的学说配置是symfony附带的默认配置:

# Doctrine Configuration
doctrine:
dbal:
    driver:   "%database_driver%"
    host:     "%database_host%"
    port:     "%database_port%"
    dbname:   "%database_name%"
    user:     "%database_user%"
    password: "%database_password%"
    charset:  UTF8

orm:
    auto_generate_proxy_classes: "%kernel.debug%"
    auto_mapping: true

我该如何解决这个问题?在这种情况下,使用用户存储库类作为用户提供程序是一个好主意吗?

2 个答案:

答案 0 :(得分:2)

使用工厂创建Doctrine实体存储库。这是一个例子:

cerad_game__game_repository__doctrine:
    class:  Cerad\Bundle\GameBundle\Doctrine\EntityRepository\GameRepository
    factory_service: 'doctrine.orm.default_entity_manager'
    factory_method:  'getRepository'
    arguments:  
        - 'Cerad\Bundle\GameBundle\Doctrine\Entity\Game'

这是个好主意吗?将存储库注入UserProvider类可能更清晰,而不是使用UserProvider方法使存储库混乱。但无论哪种方式都有效。

答案 1 :(得分:1)

只是想添加我的2c,因为我也按照你提到的那些指南。

我已经定义了Authenticator和provider类。验证者只进行必要的安全检查,提供者处理数据库连接(例如,通过令牌返回用户)。

在我的提供者的__construct中,我有这个:

protected $em;
protected $repositoryClass = 'myrepoclass';
protected $repository;

public function __construct(EntityManager $em) {
    $this->em = $em;
    $this->repository = $this->em->getRepository($this->repositoryClass);
}

现在我可以调用像$ this-> repository-> findOneById($ id)这样的查询; 我明确定义了存储库类,因为如果需要我可以更容易地切换到其他实体(我认为这可能是错误的思考)。

在我的服务档案中,我有:

api_user_provider:
  class: "%api_user_provider.class%"
  arguments: ["@doctrine.orm.entity_manager"]

api_user_authenticator:
  class: "%api_user_authenticator.class%"
  arguments: ["@api_user_provider"]

提供者类与实体类不同(至少对我来说)。我将它们分开了,因为我认为它更清洁。

嗯,这就是我如何设定的。希望这会有所帮助:)

编辑:由于我创建了一个单独的包(ApiBundle和UserBundle),我将提供者与实体类分开。我还跟踪了来自数据库'的加载安全用户。教程,这是我想出来实现API令牌认证的最后一件事。虽然您的存储库中已经有相同的方法,但我仍然认为最好将它与您的存储库类分开(当然这取决于您的需求),因为我觉得它更清晰。当然,决定取决于你该做什么:)