用户不推荐使用:" fos_user.change_password.form.factory"服务是私人的

时间:2018-03-30 03:32:27

标签: symfony fosuserbundle

我收到了以下错误。我正在使用symfony 3.4和fos bundle。密码更改路由出现此错误。如果有人可以快速帮助请。我有点匆忙。

enter image description here

2 个答案:

答案 0 :(得分:2)

我假设您正试图让控制器中的表单工厂像这样:

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

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

中定义
  • 配置/ services.yaml
  • 配置/ services.xml中
  • 或config / services.php

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

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

@符号非常重要:这是告诉容器你要传递id为serviceA的服务而不仅仅是字符串" serviceA"

服务定义为:

class serviceA {

    public function __construct($email) {

    }
}

class serviceB {

    public function __construct(ServiceA $serviceA) {

    }
}

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

服务声明为私人或公共public 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

答案 1 :(得分:0)

这不是错误。 这是一个警告,我认为这个消息非常自我解释。

在没有看到你的代码的情况下,我无法确定错误,但我在这里假设:

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

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