我想覆盖默认ExceptionListener(文档)中的setTargetPath
。但我需要额外的服务来处理这个问题。
在我看来,只有重写服务定义、将其复制到我的服务定义并创建自己的构造函数的方法,但我不喜欢这种方法。
还有别的办法吗?
至于答案,如果您使用的是form_login类型,您可以将其设置为一个常量路由,登录后应在该路由中进行重定向。配置
你应该设置这2个键:
always_use_default_target_path: true
default_target_path: /route_name_for_redirect
或者选项B,使用成功处理程序服务,只需返回RedirectResponse
我发现了另一种使用编译器传递的方法,以下步骤是必要的:
- 创建自己的类,扩展ExceptionListener,并为依赖项添加一个方法
-
创建一个包含以下内容的编译器过程:
class WebCompilerPass implements CompilerPassInterface { public function process(ContainerBuilder $container) { $definition = $container->getDefinition('security.exception_listener'); $definition->addMethodCall('yourmethod', [ new Reference('your dependency') ]); } }
- 注册编译器通行证
-
覆盖异常侦听器类参数:
security.exception_listener.class: AcmeBundleEventListenerSecurityExceptionListener