答案 0 :(得分:2)
我假设您正试图让控制器中的表单工厂像这样:
$this->get('fos_user.change_password.form_factory');
在symfony中,您可以定义services,这是symfony在请求时将创建的类。它们通常在
中定义服务可以将其他服务作为其参数,例如。在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用户捆绑包回购中请求了相同的内容,但是它被合并但是它被还原了:
答案 1 :(得分:0)
这不是错误。 这是一个警告,我认为这个消息非常自我解释。
在没有看到你的代码的情况下,我无法确定错误,但我在这里假设:
您必须通过$container->get('fos_user.change_password.form_factory')
调用该服务,并且警告说这不再是正确的方法,您应该注册依赖。
看看那里是如何运作的https://symfony.com/doc/3.4/components/dependency_injection.html