我正在使用Fosuserbundle来管理我的项目{ SF :: 3.4.8 }中的成员, 当试图通过遵循Symfony文档
来覆盖registrationController的控制器时<?php
namespace TestUserBundle;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use FOSUserBundle\Controller\RegistrationController as BaseController;
class RegistrationController extends BaseController {
public function registerAction(Request $request)
{
die("Hello");
}
}
但系统忽略该控制器并仍然使用原始控制器,因此如果有任何方法可以通过
覆盖我的控制器答案 0 :(得分:1)
首先,覆盖控制器可能不是最好的处理方式。你应该考虑 hook 进入控制器。以下是相关文档:https://symfony.com/doc/master/bundles/FOSUserBundle/controller_events.html
然后,如果您仍想覆盖控制器,则应该在依赖注入中执行操作。控制器的服务名称为fos_user.registration.controller
。
要更换服务,您只需使用:
services:
fos_user.registration.controller:
class: YourController
arguments:
$eventDispatcher: '@event_dispatcher'
$formFactory: '@fos_user.registration.form.factory'
$userManager: '@fos_user.user_manager'
$tokenStorage: 'security.token_storage'
您也可以在CompilerPass中覆盖它。这可能是最适合您的解决方案,因为您在另一个包中执行此操作。
以下是它的外观:
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class ReplaceRegistrationController extends CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$container
->getDefinition('fos_user.registration.controller')
->setClass(YourController::class)
;
}
}
别忘了register it inside your bundle:
$container->addCompilerPass(new ReplaceRegistrationController());