首页 文章

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

提问于
浏览
3

我正在使用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 回答

  • 0

    覆盖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)现在您需要创建一个控制器类,其名称与您想要覆盖的控制器位于同一位置 .

    Don't forget, in your case, you need to use SecurityController as 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

    我有同样的问题,我单独加载路由并将登录操作指向我的cutom控制器,它使用一些自定义逻辑扩展了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

相关问题