用户已弃用:"fos_user.change_password.form.factory" 服务是私有的

User Deprecated: The "fos_user.change_password.form.factory" service is private

我收到以下错误。我正在使用 symfony 3.4 和 fos 包。此错误出现在密码更改路由上。如果有人可以快速提供帮助,请提供帮助。我有点急。

这不是错误。 这是一个警告,我认为该消息非常不言自明。

没有看到你的代码,我无法确定哪里出了问题,但我的假设是:

您必须通过 $container->get('fos_user.change_password.form_factory') 调用该服务,警告说这不再是正确的方法,您应该进行依赖注入。

看看那里,看看它是如何工作的https://symfony.com/doc/3.4/components/dependency_injection.html

我假设您正在尝试像这样在您的控制器中获取表单工厂:

$this->get('fos_user.change_password.form.factory');

在 symfony 中,您可以定义 services,它们是 symfony 将在请求时创建的 类。它们通常定义在

  • config/services.yaml
  • config/services.xml
  • 或config/services.php

服务可以将其他服务作为其参数,例如在 yaml 中:

serviceA:
    class: AppBundle\Service\ServiceA
    arguments:
        $email: 'test@domain.com'
serviceB:
    class: AppBundle\Service\ServiceB
    arguments:
        $serviceA: '@serviceA'

The @ symbol is important: that's what tells the container you want to pass the service whose id is serviceA and not just the string "serviceA"

服务定义为:

class serviceA {

    public function __construct($email) {

    }
}

class serviceB {

    public function __construct(ServiceA $serviceA) {

    }
}

在这种情况下,serviceA 是 serviceB 的依赖项,这意味着 symfony 在创建 serviceB 时也会创建 serviceA(如果尚未创建)并将其提供给 serviceB 的构造函数。

服务声明为 私有或 publicpublic vs private services

从 symfony 3.4 开始,服务默认是私有的:symfony 3.4 service changes

您不能直接通过服务容器访问私有服务,您必须将它们注入其他服务或您的控制器(通过将您的控制器定义为服务)。

如果你想在你的控制器中使用它,例如。 MyController,首先将您的控制器定义为服务:

AppBundle\Controller\MyController:
    class: AppBundle\Controller\MyController
    public: true
    arguments:
        $formFactory: '@fos_user.change_password.form.factory'

并将控制器更改为:

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use FOS\UserBundle\Form\Factory\FormFactory;

/**
 * @Route(service="AppBundle\Controller\MyController")
*/
class MyController {

    private $changePasswordFormFactory;
    public function __construct(FormFactory $formFactory) {
         $this->changePasswordFormFactory = $formFactory;
    }
}

FOS user bundle change password service configuration

有趣的是,在 FOS 用户包存储库中提出了相同的请求,合并后又恢复了:

Pull request Issue comment