我正在使用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')来测试它)
问题正确覆盖此操作的解决方案是什么?
答案 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