【问题标题】:How to share functionality between controllers in Symfony when dealing with forms?处理表单时如何在 Symfony 中的控制器之间共享功能?
【发布时间】:2018-04-06 23:09:47
【问题描述】:

假设我们想在 Symfony 中构建一个简单的 cms 应用程序,我们将编写功能来“整理”帖子,然后我们将使用 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(),
   ...
]);

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

【问题讨论】:

  • 您想在每个页面上搜索相同的内容吗?例如,每个页面都允许搜索包含一些文本的帖子。

标签: forms symfony views controllers


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多