让我们想象一下,我们想在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(),
...
]);
分享此表单的方法是什么,而不必为每个控制器定义它?
答案 0 :(得分:1)
如前所述 - 嵌入式控制器是一种可行的方法。小心不要使用太多,因为它们可能很昂贵。
第二个选项是定义服务并将其作为模板的全局服务(您声明在任何地方都需要它)。描述如何做到这一点 https://symfony.com/doc/current/templating/global_variables.htm。然后,此服务可以创建此表单并将其提供给模板。使用这种方法,您可以拥有一个服务,它将提供表单和第二个服务,它将提供设置过滤条件(例如,在Doctrine ORM上)。