Symfoyn 3.4:FOS用户包:覆盖控制器

时间:2018-04-30 07:30:14

标签: symfony override fosuserbundle symfony-3.4

我正在使用Symfoyn 3.4 lts,我试图覆盖FOS User Bundle loginAction。

PS:来自Symfony 3.4,捆绑继承被弃用了, 所以要覆盖一个动作,只需创建一个具有相同Route的动作。

所以,首先我创建了一个名为src / MyVendor / MyVendorFOSUserBundle的包

第二,我从我的软件包Controller /中复制了来自vendor /的SecurityController.php。我把Route Decorator放在loginAction上面,但是在提交login form =>时遇到了问题。 CSRF令牌无效: 通过debuggin我知道 $ tokenManager 不会在Controller中注入,所以它取空值: 在这段代码中,我刚刚添加了@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和我的新控制器被忽略了(我通过在控制器构造函数上放置die('test')来测试它)

问题正确覆盖此操作的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

覆盖FOSUserBundle控制器的正确方法如下:

1)创建您的子包并将其父级设置为FOSUserBundle(我猜你没有这样做)

<?php
// src/My/UserBundle/MyUserBundle.php

namespace My\UserBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class MyUserBundle extends Bundle
{
    public function getParent()
    {
        return 'FOSUserBundle';
    }
}

2)现在您需要创建一个控制器类,其名称与您想要覆盖的控制器位于同一位置。

不要忘记,在您的情况下,您需要使用SecurityController作为BaseController!

<?php

namespace My\UserBundle\Controller;

use FOS\UserBundle\Controller\SecurityController as BaseController;
use Symfony\Component\HttpFoundation\Request;

class SecurityController extends BaseController
{
    public function loginAction(Request $request)
    {
        return parent::loginAction($request); // TODO: Change the autogenerated stub

    }
}

PS。同时阅读其他人,清除缓存可能很有用。 php bin / console cache:clear --env = dev

答案 1 :(得分:0)

我遇到了同样的问题,我单独加载了路由,并将登录操作指向了我的自定义控制器,该控制器通过一些自定义逻辑扩展了FOSUsercontroller。

fos_user_security_login:
   path: /login
   methods: [GET, POST]
   defaults: { _controller: 'YourUserBundle\Controller\SecurityController:loginAction' }

fos_user_security_check:
   path: /login_check
   methods: [POST]
   defaults: { _controller: fos_user.security.controller:checkAction }

fos_user_security_logout:
   path: /logout
   methods: [GET, POST]
   defaults: { _controller: fos_user.security.controller:logoutAction }

然后我将Controller注册为服务器以解决缺少的tokenService