Php Symfony2使用参数注入模拟侦听器
我目前正在开发一个自定义逻辑模拟Listener 我重写了Symfony\Component\Security\Http\Firewall\SwitchUserListener,因为我想在授权切换事件之前执行对某些实体存储库而不是用户实体的调用: 例如,如果且仅当要模拟的用户已将权限授予请求切换的用户时,我想授权切换 是否可以向重写的侦听器注入新参数,如条令服务或某些数组值 对自定义SwitchUserListener的调用:Php Symfony2使用参数注入模拟侦听器,php,symfony,doctrine-orm,switch-user,Php,Symfony,Doctrine Orm,Switch User,我目前正在开发一个自定义逻辑模拟Listener 我重写了Symfony\Component\Security\Http\Firewall\SwitchUserListener,因为我想在授权切换事件之前执行对某些实体存储库而不是用户实体的调用: 例如,如果且仅当要模拟的用户已将权限授予请求切换的用户时,我想授权切换 是否可以向重写的侦听器注入新参数,如条令服务或某些数组值 对自定义SwitchUserListener的调用: in services.yml parameters: s
in services.yml
parameters:
security.authentication.switchuser_listener.class: acme\appBundle\EventListener\SwitchUserListener
您的解决方案可能在这里:
Symfony定义的service security.authentication.switchuser_侦听器是一个抽象服务。它实际上不是用作侦听器的服务,而是同一个类
在代码中增加一点,以:
这是您创建的防火墙的名称,在该防火墙中可以进行用户切换
现在您有了几个选项来覆盖侦听器。
您可以继续重写类参数,然后像Symfony已经在做的那样操作参数:
$listener->replaceArgument(1, new Reference($userProvider));
$listener->replaceArgument(3, $id);
$listener->replaceArgument(6, $config['parameter']);
$listener->replaceArgument(7, $config['role']);
或者更简单地说,在扩展中编译其他方法调用
另一个解决方案是创建一个CompilerPass,它系统地删除原始侦听器,并用您自己的侦听器替换它们。这可以在您自己的bundles扩展中实现,前提是它是在SecurityBundle之后加载的
编辑:
另一个解决方案,可能比上面更简单,是创建另一个事件侦听器。
一个根据请求开火的人。这里重要的一点是,侦听器必须比您覆盖的侦听器具有更高的优先级,因为可能有多个交换机用户侦听器
棘手的部分是获取覆盖的侦听器ID的列表,因为您需要在侦听器被实例化之后,但在它们被触发之前,循环它们并调用您自己的方法来注入新的依赖项
$listener->replaceArgument(1, new Reference($userProvider));
$listener->replaceArgument(3, $id);
$listener->replaceArgument(6, $config['parameter']);
$listener->replaceArgument(7, $config['role']);
$container->removeDefinition($id);