Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用从服务定义的链提供程序_Php_Symfony_Dependency Injection_Symfony Security - Fatal编程技术网

Php 使用从服务定义的链提供程序

Php 使用从服务定义的链提供程序,php,symfony,dependency-injection,symfony-security,Php,Symfony,Dependency Injection,Symfony Security,我在我的应用程序中使用多个用户提供商: 安全性: 供应商: 供应链供应商: 链: 提供者:[实体,json] 实体: id:myapp.entity.user\u提供程序 json: id:myapp.json.user\u提供程序 现在我需要从服务加载一个用户 服务: myapp.my.service: 类别:AppBundle\Services\My 参数:[@the.defined.chain.provider] //AppBundle\Services\My 名称空间AppBundl

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

安全性:
供应商:
供应链供应商:
链:
提供者:[实体,json]
实体:
id:myapp.entity.user\u提供程序
json:
id:myapp.json.user\u提供程序
现在我需要从服务加载一个用户

服务:
myapp.my.service:
类别:AppBundle\Services\My
参数:[@the.defined.chain.provider]
//AppBundle\Services\My
名称空间AppBundle\Services;
我的班级
{
公共函数loadUser($username)
{
返回$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


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

通过查看,您只需使用服务
security.user.provider.concrete.{name}
,因此,在您的例子中,
security.user.provider.concrete.chain\u provider

有趣的是,它会自动获取providers数组作为参数吗?是的。基本上,您得到了bundle,它定义了基本服务和配置选项。然后,它使用您的配置在容器中配置其服务/参数。在这里,您使用两个提供程序配置名为
chain\u provider
的链提供程序,Symfony将知道它必须创建一个服务
security.user.provider.concrete.chain\u provider
,并将您配置的提供程序用作它的第一个参数。很好!我也会检查的,谢谢如果我的回答对你有帮助,你能验证一下吗?我能检查的时候肯定会的