Я использую несколько пользовательских провайдеров в моем приложении:
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);
}
}
Как я могу явно использовать провайдера цепочки?
Глядя на код SecurityBundle, вы просто можете воспользоваться услугой security.user.provider.concrete.{name}
так в твоем случае security.user.provider.concrete.chain_provider
Поставщики инициализируются как службы, и вы можете сделать то же самое с поставщиком цепочек:
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
Таким образом, вы будете сами создавать цепочку провайдеров пользователей как услугу (что фактически делает пакет безопасности с вашей конфигурацией) и использовать ее в двух местах.