使用从服务定义的链提供者

Use the chain provider defined from a service

我在我的应用中使用了多个用户提供商:

security:
    providers:
        chain_provider:
            chain:
                providers: [entity, json]
        entity:
            id: myapp.entity.user_provider
        json:
            id: myapp.json.user_provider

现在我需要从服务加载用户

services:
    myapp.my.service:
        class: AppBundle\Services\My
        argument: [@the.defined.chain.provider]
// AppBundle\Services\My
namespace AppBundle\Services;
class My
{
    public function loadUser($username)
    {
        return $this->userProvider->loadUserByUsername($username);
    }
}

如何显式使用链提供程序?

供应商被初始化为服务,您可以对链供应商进行同样的操作:

services:
    the.defined.chain.provider:
        class: Symfony\Component\Security\Core\User\ChainUserProvider
        arguments: [ [ @myapp.entity.user_provider, @myapp.json.user_provider ] ]

然后在您的 security.yml 文件中,将您的提供商替换为:

security:
    providers:
        default: 
            id: the.defined.chain.provider

并且在您的服务文件中只保留 myapp.my.service

的示例

因此您将自己创建用户提供者链作为一项服务(这实际上是安全包对您的配置所做的)并在两个地方使用它。

通过查看 the code of SecurityBundle,您就可以使用服务 security.user.provider.concrete.{name},所以在您的情况下 security.user.provider.concrete.chain_provider