Не удается выполнить автоматическое подключение службы FOSUserBundle, Symfony 3.4

Я пытаюсь переопределить контроллер регистрации моего FOSUserBundle. Я выполнил шаги https://symfony.com/doc/3.4/bundles/inheritance.html, но получаю следующую ошибку:

Не удается выполнить автоматическое подключение службы «AppBundle \ Controller \ RegistrationController»: аргумент «$ formFactory» метода «FOS \ UserBundle \ Controller \ RegistrationController :: __ construct ()» ссылается на интерфейс «FOS \ UserBundle \ Form \ Factory \ FactoryInterface», но такой службы не существует . Возможно, вам следует связать этот интерфейс с одной из этих существующих служб: «fos_user.profile.form.factory», «fos_user.registration.form.factory», «fos_user.change_password.form.factory», «fos_user.resetting.form. фабрика".

Мой RegistrationController.php:

// src/UserBundle/Controller/RegistrationController.php
namespace AppBundle\Controller;

use FOS\UserBundle\Controller\RegistrationController as BaseController;
use Symfony\Component\HttpFoundation\Request;

    class RegistrationController extends BaseController
    {
        public function registerAction(Request $request)
        {
            $response = parent::registerAction($request);

            // ... do custom stuff
            return $response;
        }
     }

Мой AppBundle.php

<?php

namespace AppBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

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

Если потребуется дополнительная информация, сообщите мне, чтобы я мог обновить этот вопрос.

Проверить symfony.com/blog/…

revengeance 23.05.2018 14:04

Может помочь добавление псевдонима к вашему файлу services.yaml (как подсказывает ошибка). Проблема в том, что для других контроллеров FOS (профиля, смены пароля и т. д.) Требуются другие фабрики форм. Поэтому вам нужно будет вручную подключить зависимость. Проверьте раздел autowire в документации. И, как указывалось ранее, наследование пакетов уходит, поэтому, если вы не планируете оставаться с 3.4 на неопределенный срок, не используйте его.

Cerad 23.05.2018 14:25
Стоит ли изучать 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 нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
5
2
3 076
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я точно знаю, что это работает для Symfony 3.2.3. Это только для symfony версии <= 3. Поскольку наследование пакетов исключено и будет отключено в 4. Измените версию FOSUserBundle в composer.json на

"friendsofsymfony/user-bundle": "2.0.2"

и запустите команду, чтобы обновить ее

composer update

И это решит проблему в вопросе, как? Вы это проверяли?

Cerad 23.05.2018 18:08

читайте комментарии после ответа stackoverflow.com/questions/50287563/…

Andrew Vakhniuk 23.05.2018 18:10

Но этот вопрос указывает на Symfony 3.4. Я не понимаю, как поможет откат к несовместимой версии пользовательского пакета.

Cerad 23.05.2018 18:16

да, в версии 2.0.2 пакета fosuser нет конструктора в RegistrationController, вместо этого все необходимые службы берутся из контейнера в действии регистрации

Andrew Vakhniuk 23.05.2018 18:18

вы уверены, что они несовместимы?

Andrew Vakhniuk 23.05.2018 18:19

Да, хотя я немного удивлен, что вы спросили. В общем, отвечая на вопрос, лучше убедиться, что он работает, прежде чем отправлять людей в тупик.

Cerad 23.05.2018 18:23

я использую его в symfony 3.2.3

Andrew Vakhniuk 23.05.2018 18:23

Позвольте нам продолжить обсуждение в чате.

Andrew Vakhniuk 23.05.2018 18:35

Проверьте, обновлен ли ваш пакет fosuserbundle. В registerController не должно быть конструктора

Andrew Vakhniuk 24.05.2018 13:05

должно быть так github.com/FriendsOfSymfony/FOSUserBundle/blob/2.0.x/Control‌ ler /…

Andrew Vakhniuk 24.05.2018 13:09
Ответ принят как подходящий

Я установил и настроил свежую копию Symfony 3.4 вместе с последней версией FOSUserBundle 2.1.

Поскольку наследование пакетов прекращается, просто настройте маршрут реестра так, чтобы он указывал на ваш контроллер:

# config/routes.yaml
fos_user:
    resource: "@FOSUserBundle/Resources/config/routing/all.xml"

fos_user_registration_register:
    path: /register
    controller: AppBundle\Controller\RegistrationController::registerAction

А затем вставьте фабрику форм в свой контроллер:

# app/services.yaml, keep all the standard defaults above
AppBundle\Controller\RegistrationController:
    arguments:
        $formFactory: '@fos_user.registration.form.factory'

И тебе должно быть хорошо.

Единственный оставшийся вопрос: зачем вам вообще это нужно? В основном вам нужно будет скопировать / вставить весь registerAction из вашего базового класса. В большинстве случаев вам нужно создать Подписчик на событие FOS и прослушивать события REGISTRATION_INITIALIZE, REGISTRATION_SUCCESS, REGISTRATION_COMPLETED или REGISTRATION_FAILURE.

Мне нужно, чтобы контроллер возвратил две формы вместо одной (форма регистрации). Я никогда не пробовал подписчик на событие. В моем случае это работает?

Marco Koopman 24.05.2018 10:48

Неа. Понятия не имею, почему вы можете подумать, что вам нужны две формы для регистрации, но если вы это сделаете, скопируйте / вставьте. Или подумайте о том, чтобы просто написать свой собственный код управления пользователями. FOSUserBundle популярен, но не поддается настройке, подобной вашей.

Cerad 24.05.2018 13:47

Рабочий процесс приложения должен быть следующим: Пользователь устанавливает предпочтение кофе> Пользователь создает учетную запись Затем создается учетная запись с предпочтением кофе. Единственная проблема заключается в том, что предпочтение кофе должно быть привязано к пользователю. Если я могу создать настраиваемый контроллер регистра, я могу одновременно настроить и кофе, и пользователя. Надеюсь, это проясняет это.

Marco Koopman 24.05.2018 14:38

У вас должна быть возможность настроить свою регистрационную форму, чтобы добавить предпочтение кофе. Затем прослушайте REGISTRATION_INITIALIZE и убедитесь, что пользователь выбрал предпочтение. Затем прослушайте REGISTRATION_SUCCESS и добавьте ссылку на кофе.

Cerad 24.05.2018 14:50

Не знаю точно, как это работает, честно говоря, но это работает. Спасибо!

Marco Koopman 24.05.2018 14:58

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

Marco Koopman 24.05.2018 16:04

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