处理表单时如何在 Symfony 中的控制器之间共享功能?

How to share functionality between controllers in Symfony when dealing with forms?

假设我们想要在 Symfony 中构建一个简单的 cms 应用程序,我们将把功能编码到 "crud" posts,然后我们将在一个使用 twig 和 css 的自定义格式,因此它看起来对我们的用户很有吸引力,显然我们必须通过添加搜索功能来简化查找特定 post 的过程。

所以我们使用表单 class 创建搜索表单,以便我们以后可以重用该表单:

<?php
namespace App\Form;

use App\Entity\Post;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints\Type;
use Symfony\Component\Form\Extension\Core\Type\SearchType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

class SearchForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
        ->add('search_texfield', SearchType::class, array(
            'attr' => array(
                'placeholder' => 'Search ...',
            ),
            'label' => false,
        ))
        ->add('search_button', SubmitType::class, array(
            'label' => 'Search',
        ));
    }
}
?>

我面临的问题是我必须为每个控制器创建相同的表单,[home controller, results controller, some controller...],基本上用户有权访问的每个视图都必须具有搜索功能或 Symfony 将启动 $search_form 基本上没有定义,因为包含搜索表单的 header 共享给所有视图,因为它们都扩展 base.layout.twig 所以下一个代码块是每个视图重复。

$search_form = $this->createForm(SearchForm::class);

return $this->render('some.view.twig', [
   'search_form' => $search_form->createView(),
   ...
]);

有什么方法可以共享此表单而无需为每个控制器定义它?

如前所述 - 嵌入式控制器是一种选择。请注意不要使用太多,因为它们可能很昂贵。

第二个选项是定义服务并将其作为全局模板包含在您的模板中(您说您到处都需要它)。描述了如何做
https://symfony.com/doc/current/templating/global_variables.htm。然后该服务可以创建该表单并将其提供给模板。使用这种方法,您可以拥有一个服务,它将提供表单和第二个服务,它将提供设置过滤条件(例如在 Doctrine ORM 上)。