【问题标题】:Override a controller Symfony 3.4/4.0覆盖控制器 Symfony 3.4/4.0
【发布时间】:2018-01-28 05:22:04
【问题描述】:

我目前正在尝试覆盖 FOSUserBundle 中的控制器。 在新文档中, (https://symfony.com/doc/3.4/bundles/override.html),他们说我们只需要覆盖捆绑包的路由名称。

我尝试过这样的事情:

<?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 注册表时它不起作用:

{{ render(controller('FOSUserBundle:Registration:register')) }}

这适用于 Sf3.3 :(

【问题讨论】:

    标签: php symfony twig


    【解决方案1】:

    我的解决方案 - 通过装饰 FOS 控制器服务在 Symfony 4.1 中运行良好。
    首先 - 装饰选定的控制器(文档:https://symfony.com/doc/current/service_container/service_decoration.html) 里面

    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'
    

    现在控制器将覆盖原来的 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
        }
    }
    

    【讨论】:

    • 你让我开心!顺便提一句。一个小错误,在服务中您需要在 retry_ttl 之后添加 - '@security.csrf.token_manager'
    【解决方案2】:

    在此处关注官方文档:https://symfony.com/doc/3.4/bundles/override.html#controllers

    要覆盖,我觉得文档太含糊了,你必须在你的路由配置中添加,BEFORE FOS 路由声明,一个具有相同路径的路由>不同的路线ID

    fos_user_security_login_override:
        path: /login
        defaults: { _controller: SecurityAppBundle:Security:login }
    
    #FOS routing declaration comes AFTER
    fos_user:
        resource: "@FOSUserBundle/Resources/config/routing/all.xml"
    

    【讨论】:

    • 这是我丢失的信息,在 symfony4.3 中就像一个魅力!
    【解决方案3】:

    使用这个角色((只有你的控制器的名称,没有 Bundle

    {{ render(controller('@FOSUser/Registration/register')) }}
    

    【讨论】:

    • 嘿!感谢您的回答。但我不明白:/ 当我复制您的代码时,我有错误:在模板的呈现过程中引发了异常(“找不到控制器:服务“@FOSUser/Registration/register”不存在。” )。
    • 嘿!我遇到了像你这样的问题。我做了并解决了。我想也许你的问题也可以用这种方法解决
    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多