覆盖控制器 Symfony 3.4/4.0 [英] Override a controller Symfony 3.4/4.0
问题描述
我目前正在尝试从 FOSUserBundle 覆盖控制器.在新文档中,(https://symfony.com/doc/3.4/bundles/override.html),他们说我们只需要覆盖包的路由名称.
I'm currently trying to override a controller from FOSUserBundle. In the new documentation, (https://symfony.com/doc/3.4/bundles/override.html), they said we just have to override the route name of the bundle.
我试过这样的事情:
<?php
namespace App\Controller\Bundles;
use FOS\UserBundle\Controller\RegistrationController as BaseController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class RegistrationController extends BaseController {
/**
* @Route("/registration/", name="fos_user_registration_register")
* @param Request $request
*
* @return Response
*/
public function registerAction(Request $request) {
// My code
}
但是当我呈现 FOS 注册表时它不起作用:
But it does not work when I am rendering the FOS register form :
{{ render(controller('FOSUserBundle:Registration:register')) }}
这是与 Sf3.3 一起使用的 :(
This was working with Sf3.3 :(
推荐答案
我的解决方案 - 通过装饰 FOS 控制器服务在 Symfony 4.1 中工作正常.
首先 - 装饰选定的控制器(文档:https://symfony.com/doc/current/service_container/service_decoration.html)内
My solution - works fine from Symfony 4.1 by decorate FOS controller service.
Firstly - decorate selected controller (docs: https://symfony.com/doc/current/service_container/service_decoration.html)
inside
App\Controller\ResettingController:
decorates: fos_user.resetting.controller
arguments:
- '@App\Controller\ResettingController.inner'
- '@event_dispatcher'
- '@fos_user.resetting.form.factory'
- '@fos_user.user_manager'
- '@fos_user.util.token_generator'
- '@fos_user.mailer'
- '%fos_user.resetting.retry_ttl%'
- '@security.csrf.token_manager'
现在将覆盖原始重置控制器的控制器:
Now controller which will override original ResettingController:
<?php
namespace App\Controller;
use FOS\UserBundle\Controller\ResettingController as BaseResettingController;
use FOS\UserBundle\Form\Factory\FactoryInterface;
use FOS\UserBundle\Mailer\MailerInterface;
use FOS\UserBundle\Model\UserManagerInterface;
use FOS\UserBundle\Util\TokenGeneratorInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
class ResettingController extends AbstractController
{
/**
* @var BaseResettingController
*/
private $resettingController;
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
/**
* @var FactoryInterface
*/
private $formFactory;
/**
* @var UserManagerInterface
*/
private $userManager;
/**
* @var TokenGeneratorInterface
*/
private $tokenGenerator;
/**
* @var MailerInterface
*/
private $mailer;
/**
* @var string
*/
private $retryTtl;
/**
* @var CsrfTokenManagerInterface
*/
private $csrfTokenManager;
/**
* ResettingController constructor.
*
* @param BaseResettingController $resettingController
* @param EventDispatcherInterface $eventDispatcher
* @param FactoryInterface $formFactory
* @param UserManagerInterface $userManager
* @param TokenGeneratorInterface $tokenGenerator
* @param MailerInterface $mailer
* @param $retryTtl
*/
public function __construct(
BaseResettingController $resettingController,
EventDispatcherInterface $eventDispatcher,
FactoryInterface $formFactory,
UserManagerInterface $userManager,
TokenGeneratorInterface $tokenGenerator,
MailerInterface $mailer,
$retryTtl,
CsrfTokenManagerInterface $csrfTokenManager
)
{
$this->resettingController = $resettingController;
$this->eventDispatcher = $eventDispatcher;
$this->formFactory = $formFactory;
$this->userManager = $userManager;
$this->tokenGenerator = $tokenGenerator;
$this->mailer = $mailer;
$this->retryTtl = $retryTtl;
$this->csrfTokenManager = $csrfTokenManager;
}
public function requestAction()
{
return $this->resettingController->requestAction();
}
/**
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function sendEmailAction(Request $request)
{
return $this->resettingController->sendEmailAction($request);
}
/**
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function checkEmailAction(Request $request)
{
return $this->resettingController->checkEmailAction($request);
}
/**
* @param string $token
* @return null|RedirectResponse|\Symfony\Component\HttpFoundation\Response
*/
public function resetAction(Request $request, string $token)
{
// custom reset action
}
}
这篇关于覆盖控制器 Symfony 3.4/4.0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!