覆盖Symfony 3.4

时间:2018-04-19 09:07:06

标签: php symfony override fosuserbundle symfony-3.4

我正在使用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");
    }
}

但系统忽略该控制器并仍然使用原始控制器,因此如果有任何方法可以通过

覆盖我的控制器

1 个答案:

答案 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());