无法自动装配服务 FOSUserBundle,Symfony 3.4
Posted
技术标签:
【中文标题】无法自动装配服务 FOSUserBundle,Symfony 3.4【英文标题】:Cannot autowire service FOSUserBundle, Symfony 3.4 【发布时间】:2018-11-02 09:05:10 【问题描述】:我正在尝试覆盖我的 FOSUserBundle 的注册控制器。 我已按照https://symfony.com/doc/3.4/bundles/inheritance.html 上的步骤操作,但出现以下错误:
无法自动装配服务“AppBundle\Controller\RegistrationController”:方法“FOS\UserBundle\Controller\RegistrationController::__construct()”的参数“$formFactory”引用接口“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/… 向您的 services.yaml 文件添加别名(如错误所示)可能会有所帮助。问题是其他 FOS 控制器(配置文件、更改密码等)需要不同的表单工厂。因此,您将需要手动连接依赖项。检查文档中的自动装配部分。正如前面所指出的,捆绑继承正在消失,所以除非你打算无限期地使用 3.4,否则不要使用它。 【参考方案1】:我安装并配置了 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 event subscriber 并监听 REGISTRATION_INITIALIZE、REGISTRATION_SUCCESS、REGISTRATION_COMPLETED 或 REGISTRATION_FAILURE 事件。
【讨论】:
我需要控制器返回两个表格而不是一个(注册表单)。我从未尝试过事件订阅者。对我有用吗? 不。不知道为什么您可能认为您需要两张表格才能注册,但如果您这样做了,则复制/粘贴。或者考虑只编写自己的用户管理代码。 FOSUserBundle 很受欢迎,但不适合您的自定义。 应用程序的工作流程需要是: 用户设置咖啡偏好 > 用户创建帐户 然后使用咖啡偏好创建一个帐户。唯一的问题是咖啡偏好需要与用户相关联。如果我可以制作自定义注册控制器,我可以同时制作咖啡偏好和用户。我希望这可以澄清它。 您应该能够自定义您的注册表以添加咖啡偏好。然后监听 REGISTRATION_INITIALIZE 并验证用户选择了偏好。然后监听 REGISTRATION_SUCCESS 并添加咖啡链接。 说实话也不确定这是如何工作的,但它确实有效。谢谢!【参考方案2】:我确定这适用于 Symfony 3.2.3 这仅适用于 symfony 版本
"friendsofsymfony/user-bundle": "2.0.2"
并运行命令来更新它
composer update
【讨论】:
那将如何解决问题中的问题?你测试过这个吗? 在回答***.com/questions/50287563/…之后阅读cmets 但是这个问题指定了 Symfony 3.4。我看不出回滚到不兼容的用户包版本会有什么帮助。 是的,在 fosuser bundle 2.0.2 版本中,RegistrationController 中没有构造函数,而是所有需要的服务都从注册操作中的容器中获取 你确定它们不兼容吗?以上是关于无法自动装配服务 FOSUserBundle,Symfony 3.4的主要内容,如果未能解决你的问题,请参考以下文章