【问题标题】:How can I resolve FormBuilder inside a service (Symfony4)?如何在服务(Symfony4)中解析 FormBuilder?
【发布时间】:2019-03-05 16:04:42
【问题描述】:

我尝试在我的服务中创建一个表单:

namespace App\Service;


class FormGenerator
{

public function createForm($slug,$request)
  {

    $item = new $EntityName();
    $formBuilder = $this->createFormBuilder($item);

    ....

但我收到错误消息:

试图调用名为“createFormBuilder”的未定义方法 类“App\Service\FormGenerator”。

【问题讨论】:

  • 这是您两天内提出的第四个问题,实际上是同一个“问题”:不了解服务的工作原理。他们有一个很好的理由得分为负。正如我之前所说:阅读文档!如果您使用 Symfony,这是一个非常基本的问题。根据您的声誉,您应该知道得更多。

标签: php symfony oop service formbuilder


【解决方案1】:

表单构建器实例存在于AbstractController 中(大多数控制器都对其进行了扩展)。这就是为什么你可以使用$this->createFormBuilder()。但是在这种情况下,您已经创建了一个单独的服务,因此您需要自己解析表单构建器。

我不确定你会如何在 Symfony 中做到这一点,但根据文档和this link,你可以键入提示表单构建器类,你会在你的方法中获得实例。像下面的东西

代码已更新为通过构造函数注入导入 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 将此类 (FormGenerator) 解析为您选择的逻辑,最好在此服务类的订阅者的构造函数中对其进行类型提示。希望它更有意义

【讨论】:

  • 虽然这是赞成甚至接受的,但这并不能回答问题。 Typehinting 的自动注入仅适用于控制器方法(Actions),而这个问题是关于在服务(App\Service\FormGenerator)中使用服务(FormBuilderInterface)。
  • 我认为你在这种情况下是部分正确的。因为自动注入适用于您在 src/ 目录下创建的任何类。但并非所有方法都需要。如果您在服务类的构造函数中键入提示,那么您将自动注入该依赖项(如果我的记忆正确,我过去曾这样做过)。如果您可以确认,我将使用必要的代码更新答案:)
  • Actaully 我继续并更新了答案,如果你介意看一下,我会很感激,symfony noob 请
【解决方案2】:

如上一个答案所述,表单构建器实例存在于大多数控制器扩展的 AbstractController 中。

但是,如果你想在 Service 中使用这个 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… */
        ];
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 2018-06-28
    • 1970-01-01
    • 2013-02-01
    • 2016-03-14
    • 2020-06-10
    • 1970-01-01
    • 2011-10-13
    相关资源
    最近更新 更多