如何在服务 (Symfony4) 中解析 FormBuilder?
How can I resolve FormBuilder inside a service (Symfony4)?
我尝试在我的服务中创建一个表单:
namespace App\Service;
class FormGenerator
{
public function createForm($slug,$request)
{
$item = new $EntityName();
$formBuilder = $this->createFormBuilder($item);
....
但我收到错误消息:
Attempted to call an undefined method named "createFormBuilder" of
class "App\Service\FormGenerator".
表单生成器实例存在于 AbstractController
(大多数控制器扩展它的地方)。所以这就是为什么你可以使用 $this->createFormBuilder()
。但是在这种情况下,您已经创建了一个单独的服务,因此您需要自己解析表单生成器。
我不确定您将如何在 Symfony 中执行此操作,但根据文档和 this link 您可以键入提示表单构建器 class 并且您将在您的方法中获得实例。类似下面
代码已更新为通过构造函数注入导入 FormBuilderInterface
use Symfony\Component\Form\FormBuilderInterface;
class FormGenerator
{
private $builder;
public function __construct(FormBuilderInterface $builder) {
$this->builder = $builder;
}
public function createForm($slug,$request)
{
$this->builder
->add('name')
->add('speciesCount')
->add('funFact')
}
}
然后您必须通过 DI 将此 class (FormGenerator
) 解析为您选择的逻辑,最好是在此服务订阅者的构造函数中对其进行类型提示 class.希望它更有意义
如之前的回答所述,表单生成器实例存在于大多数控制器扩展的 AbstractController 中。
但是,如果您想在服务中使用此 FormBuilder(用例很少,但可以做到),我建议您使用 FormFactory 服务。
这是一个例子:
use Symfony\Component\Form\FormFactoryInterface;
class MyService
{
protected $formFactory;
public function __construct(FormFactoryInterface $formFactory) {
$this->formFactory = $formFactory;
}
public function getMyForms(): array
{
return [
'deleteForm' => $this->formFactory->create()
->addAction(…)->setMethod('DELETE')
->getForm(),
'addForm' => $this->formFactory->create()
->addAction(…)
->getForm(),
/* etc… */
];
}
}
我尝试在我的服务中创建一个表单:
namespace App\Service;
class FormGenerator
{
public function createForm($slug,$request)
{
$item = new $EntityName();
$formBuilder = $this->createFormBuilder($item);
....
但我收到错误消息:
Attempted to call an undefined method named "createFormBuilder" of class "App\Service\FormGenerator".
表单生成器实例存在于 AbstractController
(大多数控制器扩展它的地方)。所以这就是为什么你可以使用 $this->createFormBuilder()
。但是在这种情况下,您已经创建了一个单独的服务,因此您需要自己解析表单生成器。
我不确定您将如何在 Symfony 中执行此操作,但根据文档和 this link 您可以键入提示表单构建器 class 并且您将在您的方法中获得实例。类似下面
代码已更新为通过构造函数注入导入 FormBuilderInterface
use Symfony\Component\Form\FormBuilderInterface;
class FormGenerator
{
private $builder;
public function __construct(FormBuilderInterface $builder) {
$this->builder = $builder;
}
public function createForm($slug,$request)
{
$this->builder
->add('name')
->add('speciesCount')
->add('funFact')
}
}
然后您必须通过 DI 将此 class (FormGenerator
) 解析为您选择的逻辑,最好是在此服务订阅者的构造函数中对其进行类型提示 class.希望它更有意义
如之前的回答所述,表单生成器实例存在于大多数控制器扩展的 AbstractController 中。
但是,如果您想在服务中使用此 FormBuilder(用例很少,但可以做到),我建议您使用 FormFactory 服务。
这是一个例子:
use Symfony\Component\Form\FormFactoryInterface;
class MyService
{
protected $formFactory;
public function __construct(FormFactoryInterface $formFactory) {
$this->formFactory = $formFactory;
}
public function getMyForms(): array
{
return [
'deleteForm' => $this->formFactory->create()
->addAction(…)->setMethod('DELETE')
->getForm(),
'addForm' => $this->formFactory->create()
->addAction(…)
->getForm(),
/* etc… */
];
}
}