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

时间:2018-04-06 23:09:48

标签: forms symfony views controllers

让我们想象一下,我们想在Symfony中构建一个简单的cms应用程序,我们将把这些功能编写为" crud"这些帖子然后我们将使用twig和css以自定义格式显示这些数据,因此它看起来对我们的用户很有吸引力,显然我们必须通过添加搜索功能来轻松查找特定帖子。

因此我们使用表单类创建搜索表单,以便稍后重用表单:

<?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',
        ));
    }
}
?>

我面临的问题是我必须为每个控制器,[家庭控制器,结果控制器,某些控制器...]创建相同的表单,基本上每个用户都可以访问的视图必须具有搜索功能或Symfony将启动$ search_form未定义,因为包含搜索表单的标头被共享到所有视图,因为它们都扩展了base.layout.twig,因此每个视图重复下一个代码块。

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

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

分享此表单的方法是什么,而不必为每个控制器定义它?

1 个答案:

答案 0 :(得分:1)

如前所述 - 嵌入式控制器是一种可行的方法。小心不要使用太多,因为它们可能很昂贵。

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