覆盖控制器 Symfony 3.4/4.0 [英] Override a controller Symfony 3.4/4.0

查看:25
本文介绍了覆盖控制器 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆