Я пытаюсь переопределить контроллер регистрации моего 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';
}
}
Если потребуется дополнительная информация, сообщите мне, чтобы я мог обновить этот вопрос.
Может помочь добавление псевдонима к вашему файлу services.yaml (как подсказывает ошибка). Проблема в том, что для других контроллеров FOS (профиля, смены пароля и т. д.) Требуются другие фабрики форм. Поэтому вам нужно будет вручную подключить зависимость. Проверьте раздел autowire в документации. И, как указывалось ранее, наследование пакетов уходит, поэтому, если вы не планируете оставаться с 3.4 на неопределенный срок, не используйте его.




Я точно знаю, что это работает для Symfony 3.2.3. Это только для symfony версии <= 3. Поскольку наследование пакетов исключено и будет отключено в 4. Измените версию FOSUserBundle в composer.json на
"friendsofsymfony/user-bundle": "2.0.2"
и запустите команду, чтобы обновить ее
composer update
И это решит проблему в вопросе, как? Вы это проверяли?
читайте комментарии после ответа stackoverflow.com/questions/50287563/…
Но этот вопрос указывает на Symfony 3.4. Я не понимаю, как поможет откат к несовместимой версии пользовательского пакета.
да, в версии 2.0.2 пакета fosuser нет конструктора в RegistrationController, вместо этого все необходимые службы берутся из контейнера в действии регистрации
вы уверены, что они несовместимы?
Да, хотя я немного удивлен, что вы спросили. В общем, отвечая на вопрос, лучше убедиться, что он работает, прежде чем отправлять людей в тупик.
я использую его в symfony 3.2.3
Позвольте нам продолжить обсуждение в чате.
Проверьте, обновлен ли ваш пакет fosuserbundle. В registerController не должно быть конструктора
должно быть так github.com/FriendsOfSymfony/FOSUserBundle/blob/2.0.x/Control ler /…
Я установил и настроил свежую копию 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.
Мне нужно, чтобы контроллер возвратил две формы вместо одной (форма регистрации). Я никогда не пробовал подписчик на событие. В моем случае это работает?
Неа. Понятия не имею, почему вы можете подумать, что вам нужны две формы для регистрации, но если вы это сделаете, скопируйте / вставьте. Или подумайте о том, чтобы просто написать свой собственный код управления пользователями. FOSUserBundle популярен, но не поддается настройке, подобной вашей.
Рабочий процесс приложения должен быть следующим: Пользователь устанавливает предпочтение кофе> Пользователь создает учетную запись Затем создается учетная запись с предпочтением кофе. Единственная проблема заключается в том, что предпочтение кофе должно быть привязано к пользователю. Если я могу создать настраиваемый контроллер регистра, я могу одновременно настроить и кофе, и пользователя. Надеюсь, это проясняет это.
У вас должна быть возможность настроить свою регистрационную форму, чтобы добавить предпочтение кофе. Затем прослушайте REGISTRATION_INITIALIZE и убедитесь, что пользователь выбрал предпочтение. Затем прослушайте REGISTRATION_SUCCESS и добавьте ссылку на кофе.
Не знаю точно, как это работает, честно говоря, но это работает. Спасибо!
Извините за вопрос, но вы были правы. Мне нужен прослушиватель событий, который может публиковать варианты кофе после регистрации пользователя. Я следил за документами, и слушатель работает. Единственная проблема в том, что он вызывается одновременно с средством визуализации страницы. Я не могу понять, как я могу вызвать своего слушателя после регистрации пользователя.
Проверить symfony.com/blog/…