我正在使用Symfoyn 3.4 lts,我试图覆盖FOS User Bundle loginAction .
PS:从Symfony 3.4开始,bundle继承被弃用,因此要覆盖一个动作,只需创建一个具有相同Route的动作 .
所以,起初我创建了一个我称为src / MyVendor / MyVendorFOSUserBundle的包
第二,我从我的捆绑控制器/中复制了来自vendor /的SecurityController.php而且我将路由装饰器放在loginAction上面但是我在提交登录表单时遇到了问题=>无效的CSRF令牌:通过debuggin我认为 $tokenManager 不是't be injected in the Controller so it' s null值:在这段代码中,我刚刚添加了@Route装饰器,并将BaseController扩展到复制的Contoller .
#src/MyVendor/MyVendorFOSUserBundle/Controller/SecurityController.php:
class SecurityController extends BaseController
{
private $tokenManager;
public function __construct(CsrfTokenManagerInterface $tokenManager = null)
{
$this->tokenManager = $tokenManager;
}
/**
* @param Request $request
* @return Response
* @Route("/login")
*/
public function loginAction(Request $request)
{ ... }
因此,为了尝试纠正这个问题,我尝试在@Route Decorator中添加属性名称,并保持与FOS用户包中相同的路由名称,但在这种情况下,执行的FOS用户包的Controller和我的新控制器被忽略了(我通过在Controller构造函数上放置die('test')来测试它)
问题正确覆盖此操作的解决方案是什么?
2 回答
覆盖FOSUserBundle控制器的正确方法如下:
1)创建您的子包并将其父级设置为FOSUserBundle(我想,您没有这样做)
2)现在您需要创建一个控制器类,其名称与您想要覆盖的控制器位于同一位置 .
Don't forget, in your case, you need to use SecurityController as BaseController!
PS . 同时阅读其他人,清除缓存可能很有用 . php bin/console cache:clear --env=dev
我有同样的问题,我单独加载路由并将登录操作指向我的cutom控制器,它使用一些自定义逻辑扩展了FOSUsercontroller .
然后我将Controller注册为服务器以解决丢失的tokenService