如何在服务 (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… */
        ];
    }
}