无法自动装配服务 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的主要内容,如果未能解决你的问题,请参考以下文章

无法在控制器中自动装配多个服务

无法自动装配服务:参数引用类但不存在此类服务

Spring框架的新手收到此错误:无法自动装配字段:

Symfony 3.4 自动装配服务

Spring:无法从父上下文自动装配 bean

Thymeleaf-Spring4 无法自动装配 TemplateEngine