FOSUserBundle - Ошибка отмены контроллера регистрации

Я пытаюсь переопределить контроллер регистрации FOSUserBundle. Вот моя конфигурация:

services:
    project.registration.controller:
        class: Project\UserBundle\Controller\RegistrationController
        arguments: [ @event_dispatcher,@fos_user.registration.form.factory,@fos_user.user_manager,@security.token_storage]

И контроллер пока:

<?php
namespace Project\UserBundle\Controller;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use FOS\UserBundle\Form\Factory\FactoryInterface;
use FOS\UserBundle\Model\UserManagerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use FOS\UserBundle\Controller\RegistrationController as BaseController;

class RegistrationController extends BaseController
{
    public function __construct(EventDispatcherInterface $eventDispatcher, FactoryInterface $formFactory, UserManagerInterface $userManager, TokenStorageInterface $tokenStorage)
    {
        parent::__construct($eventDispatcher, $formFactory, $userManager, $tokenStorage);
    }

Однако каждый раз, когда я пытаюсь перейти на страницу регистрации, я встречаю эту ошибку:

Catchable Fatal Error: Argument 1 passed to Project\UserBundle\Controller\RegistrationController::__construct() must implement interface Symfony\Component\EventDispatcher\EventDispatcherInterface, none given, called in C:\wamp\www\cmagic\vendor\symfony\symfony\src\Symfony\Component\HttpKernel\Controller\ControllerResolver.php on line 187 and defined

Я думаю, что следил за контроллерами, используемыми в качестве служб, или я пропустил шаг?

РЕДАКТИРОВАТЬ : Это для Symfony 2.8

Что вы хотите изменить в контроллере? Честно говоря, эти контроллеры делают почти все необходимое и отправляют события, которые в 90% случаев вы можете просто подключить несколько слушателей событий и обрабатывать вещи таким образом.

qooplmao 12.05.2018 03:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
1
878
1

Ответы 1

У меня это сработало в Symfony 3, но getParent () {} для пакетов уже устарело в версии 3.4 и отключено в версии 4.

namespace AppBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AppBundle extends Bundle
{
    public function getParent()
    {
        return 'FOSUserBundle';
    }
}

namespace AppBundle\Controller;



use FOS\UserBundle\Controller\RegistrationController as BaseController;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class RegistrationController extends BaseController
{
    /**
     * @param Request $request
     *
     * @return Response
     */
    public function registerAction(Request $request)
    {
        /** @var $formFactory FactoryInterface */
        $formFactory = $this->get('fos_user.registration.form.factory');
        /** @var $userManager UserManagerInterface */
        $userManager = $this->get('fos_user.user_manager');
        /** @var $dispatcher EventDispatcherInterface */
        $dispatcher = $this->get('event_dispatcher');

        $user = $userManager->createUser();
        $user->setEnabled(true);

        $event = new GetResponseUserEvent($user, $request);
        $dispatcher->dispatch(FOSUserEvents::REGISTRATION_INITIALIZE, $event);

        if (null !== $event->getResponse()) {
            return $event->getResponse();
        }

        $form = $formFactory->createForm();
        $form->setData($user);

        $form->handleRequest($request);

        if ($form->isSubmitted()) {
            if ($form->isValid()) {
                $event = new FormEvent($form, $request);
                $dispatcher->dispatch(FOSUserEvents::REGISTRATION_SUCCESS, $event);

                $userManager->updateUser($user);

                if (null === $response = $event->getResponse()) {
                    $url = $this->generateUrl('fos_user_registration_confirmed');
                    $response = new RedirectResponse($url);
                }

                $dispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));

                return $response;
            }

            $event = new FormEvent($form, $request);
            $dispatcher->dispatch(FOSUserEvents::REGISTRATION_FAILURE, $event);

            if (null !== $response = $event->getResponse()) {
                return $response;
            }
        }

        return $this->render('@FOSUser/Registration/register.html.twig', array(
            'form' => $form->createView(),
        ));
    }
}

Это было то, что я сделал в первую очередь, и я получил ту же ошибку не на моем контроллере, а на контроллере регистрации FOSUserBundle.

Fabien Claude 11.05.2018 14:25

Это странно, поскольку пользовательский контроллер fos вообще не имеет метода __construct, он получает eventDispatcher из контейнера в действии регистрации /** @var $dispatcher EventDispatcherInterface */ $dispatcher = $this->get('event_dispatcher');.

Andrew Vakhniuk 11.05.2018 14:43

о, я понял, попробуйте использовать более свежую версию FOSUserBundle, я использую этот "friendsofsymfony/user-bundle": "~2.0@dev",

Andrew Vakhniuk 11.05.2018 14:46

Пакет обновлен до версии 2.1.2, я все еще получаю эту ошибку.

Fabien Claude 11.05.2018 16:35

Можете ли вы попробовать использовать мой метод registerAction, который я предоставил выше, без конструктора и без конфигурации службы.

Andrew Vakhniuk 11.05.2018 16:59

Я нашел причину: проблема в UserBundle версии 2.1, я откатился на 2.0.2, теперь он работает.

Fabien Claude 15.05.2018 10:37

Другие вопросы по теме