用户已弃用:"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 的构造函数。
服务声明为 私有或 public: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 用户包存储库中提出了相同的请求,合并后又恢复了:
我收到以下错误。我正在使用 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 的构造函数。
服务声明为 私有或 public: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 用户包存储库中提出了相同的请求,合并后又恢复了: