编程语言
首页 > 编程语言> > PHP-Symfony2.8如何构建可从所有模板查看的搜索表单

PHP-Symfony2.8如何构建可从所有模板查看的搜索表单

作者:互联网

建立在我的基本树枝模板中呈现以便始终可见的搜索表单的最佳方法是什么?

我根据需要创建了一个表单类型类,可以在控制器中使用它
然后在模板上呈现表单,但是对其他控制器和模板执行相同操作没有任何意义,因此我编写了一项服务:

<?php

namespace MyBundle\Services;

use Symfony\Component\Form\FormFactory;

use MyBundle\Form\FulltextSearchType;

class FulltextSearch {

    private $formFactory;

    public function __construct(FormFactory $formFactory) {
        $this->formFactory = $formFactory;
    }

    public function mySearch() {
        $form = $this->formFactory->createBuilder('MyBundle\Form\FulltextSearchType');

        return $form->getForm()->createView();
        //return $form->createView();
    }

}

我还在services.yml和config.yml中定义了服务,并在模板中渲染了该服务:

<form action="{{ path('my_search') }}" method="post">    
    {{ form_widget(fulltextSearch.mySearch) }}
</form>

它有效,我收到表格,提交表格后收到请求,但我怀疑这是否是实现我的问题标题所说的最佳方法

解决方法:

可以通过将服务作为全局变量注入所有模板来实现:

首先,使用其依赖项定义服务:

services:
    app.fulltextsearch:
        class: MyBundle\Services\FulltextSearch
        arguments: ['@form.factory']

其次,将该服务定义为全局Twig变量:

# app/config/config.yml
twig:
    # ...
    globals:
        fulltextSearch: '@app.fulltextsearch'

而已!

每当在模板中访问全局变量时,都会从服务容器请求服务,然后您就可以访问该对象.

另一方面,我建议您在FulltextSearch :: mySearch方法内创建整个表单,以实现主要的可重用性:

class FulltextSearch
{
    private $router;

    //...

    public function mySearch() {
        $form = $this->formFactory->createBuilder()
            ->setAction($this->router->generate('my_search'))
            ->add('search', FulltextSearch::class)
            ->getForm();

        return $form->createView();
    }
}

注意:确保在app.fulltextsearch定义以及“ @ form.factory”中注入@router服务.

接下来,您的基本搜索模板如下所示((不需要< form>标记,操作和方法属性,默认情况下这是POST):

{{ form(fulltextSearch.mySearch) }}

标签:symfony,twig,php
来源: https://codeday.me/bug/20191118/2026374.html