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

Php 作为用户提供者和依赖项注入的用户存储库类,php,symfony,dependency-injection,doctrine-orm,api-key,Php,Symfony,Dependency Injection,Doctrine Orm,Api Key,我将遵循以下步骤(如何使用API密钥验证用户)在我的应用程序中实现API密钥 我使用基于此创建的用户存储库类(如何从数据库加载安全用户)作为预身份验证过程中所需的用户提供程序,因为该类已经具有我下面的教程中所述的用户提供程序所需的方法,即loadUserByUsername(),refreshUser()和supportsClass() Symfony调用myapikey\u authenticator服务,该服务需要用户提供程序作为参数。因此,我配置了另一个名为userprovider的服务,

我将遵循以下步骤(如何使用API密钥验证用户)在我的应用程序中实现API密钥

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

Symfony调用my
apikey\u 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

我怎样才能解决这个问题?在这种情况下,使用user repository类作为用户提供者是一个好主意吗?

原则实体存储库是使用工厂创建的。以下是一个例子:

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方法将存储库弄得一团糟可能会更干净。但这两种方法都可以。条令实体存储库是使用工厂创建的。以下是一个例子:

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方法将存储库弄得一团糟可能会更干净。但这两种方法都可以。条令实体存储库是使用工厂创建的。以下是一个例子:

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方法将存储库弄得一团糟可能会更干净。但这两种方法都可以。条令实体存储库是使用工厂创建的。以下是一个例子:

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方法将存储库弄得一团糟可能会更干净。但是任何一种方法都可以。

我只是想添加我的2c,因为我也遵循了您提到的指南

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

在我的提供者的_构造中,我有以下内容:

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

public function __construct(EntityManager $em) {
    $this->em = $em;
    $this->repository = $this->em->getRepository($this->repositoryClass);
}
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"]
现在我可以直接调用查询,比如$this->repository->findOneById($id); 我明确定义了repository类,因为它允许在需要时更容易地切换到其他实体(当然,这可能是错误的想法)

在我的服务文件中,我有以下内容:

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

public function __construct(EntityManager $em) {
    $this->em = $em;
    $this->repository = $this->em->getRepository($this->repositoryClass);
}
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"]
提供者类与实体类不同(至少对我而言)。我把它们分开了,因为我觉得这样更干净

我就是这样安排的。希望这有帮助:)


编辑:由于我创建了一个单独的bundle(ApiBundle和UserBundle),所以我将提供者与实体类分开。我还学习了“从数据库加载安全用户”教程,这是我实现API令牌身份验证的最后一步。虽然您的存储库中已经有了相同的方法,但我仍然认为最好像我一样将其与存储库类分开(当然这取决于您的需要),因为我认为这样做更有效。当然,该怎么做取决于您:)

我只是想添加我的2c,因为我也遵循了您提到的指南

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

在我的提供者的_构造中,我有以下内容:

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

public function __construct(EntityManager $em) {
    $this->em = $em;
    $this->repository = $this->em->getRepository($this->repositoryClass);
}
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"]
现在我可以直接调用查询,比如$this->repository->findOneById($id); 我明确定义了repository类,因为它允许在需要时更容易地切换到其他实体(当然,这可能是错误的想法)

在我的服务文件中,我有以下内容:

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

public function __construct(EntityManager $em) {
    $this->em = $em;
    $this->repository = $this->em->getRepository($this->repositoryClass);
}
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"]
提供者类与实体类不同(至少对我而言)。我把它们分开了,因为我觉得这样更干净

我就是这样安排的。希望这有帮助:)


编辑:由于我创建了一个单独的bundle(ApiBundle和UserBundle),所以我将提供者与实体类分开。我还学习了“从数据库加载安全用户”教程,这是我实现API令牌身份验证的最后一步。虽然您的存储库中已经有了相同的方法,但我仍然认为最好像我一样将其与存储库类分开(当然这取决于您的需要),因为我认为这样做更有效。当然,该怎么做取决于您:)

我只是想添加我的2c,因为我也遵循了您提到的指南

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

在我的提供者的_构造中,我有以下内容:

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

public function __construct(EntityManager $em) {
    $this->em = $em;
    $this->repository = $this->em->getRepository($this->repositoryClass);
}
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"]
现在我可以直接调用查询,比如$this->repository->findOneById($id); 我明确定义了repository类,因为它允许在需要时更容易地切换到其他实体(当然,这可能是错误的想法)

在我的服务文件中,我有以下内容:

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

public function __construct(EntityManager $em) {
    $this->em = $em;
    $this->repository = $this->em->getRepository($this->repositoryClass);
}
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"]
提供者类与实体类不同(至少对我而言)。我把它们分开了,因为我觉得这样更干净

我就是这样安排的。希望这有帮助:)

编辑:由于我创建了一个单独的bundle(ApiBundle和UserBundle),所以我将提供者与实体类分开。我还学习了“从数据库加载安全用户”教程,这是我实现API tok的最后一件事