【问题标题】:Correct way to implement a search function in a symfony project?在 symfony 项目中实现搜索功能的正确方法?
【发布时间】:2020-08-24 00:58:15
【问题描述】:

我正在学习 Symfony,并且正在创建一个用于练习的 CRUD 应用程序。

我想在列出我的数据库项目的页面中实现搜索功能。我想知道实现这一目标的正确方法是什么。

现在,我已经用下面的代码创建了一个 searchType 和 searchController:

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class searchController extends Controller
{

    public function searchAction(){

        $formulario = $this->createForm('AppBundle\Form\SearchType');
        return $this->render('searchBar.html.twig', ['form' => $formulario->createView()]);

    }

}
class SearchType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('key', ChoiceType::class,
                  ['choices' => [
                      'Elegir Campo...' => 0,
                      'Modelo' => 1,
                      'Marca' => 2,
                      'Año' => 3,
                      'Propietario' => 4
                  ]
                  ])
            ->add('term', TextType::class)
            ->add('buscar', SubmitType::class)
        ;
    }

}

我有另一个名为 itemController 的控制器,其中有列表、添加、修改和删除操作。使用 twig render() 函数,我在项目列表页面中呈现 searchBar。从“key”和“term”元素中获取值并使用它们对数据库进行查询的正确方法是什么?

我试图在没有 searchController/searchType 的情况下实现这一点,我在模板中使用了一个简单的<form>,并在 listAction 中使用 $request->get() 方法获取了键和术语值。在我创建了一个 switch-case 语句来根据键值执行查询之后。我可以像这样实现我想要的,但我希望能够以正确的方式做到这一点。

有人可以帮助我/给我一些关于如何继续的提示吗?

谢谢。

更新:

项目控制器:

/**
*@Route("/items", name="items")
*/

public function listAction(Request $request){

  $em = $this->getDoctrine()->getManager();
  $items = $em->getRepository('AppBundle:Item')->findAll();
  
  return $this->render('items.html.twig', ['items' => $items]);

}

我的 items.html.twig:

{% extends base.html.twig %}
{% block body %}
{{ render(controller('AppBundle:search:search')) }}
 ...
{% endblock %}

我的 searchBar.html.twig:

{{ form_start(form, {'attr': {'class': 'form-inline float-left my-2 my-lg-0'}}) }}
{{ form_widget(form.key) }}
{{ form_widget(form.term, {'attr': {'class': 'ml-1'}}) }}
{{ form_widget(form.buscar, {'attr': {'class': 'btn btn-outline-success ml-1'}}) }}
{{ form_end(form) }}

我在路由方面尝试过什么并与 searchController 一起使用:

/**
* @Route("/search", name="search")
*/
public function searchAction(Request $request){
  
  $em = $this->getDoctrine()->getManager();
  $formulario = $this->createForm('AppBundle\Form\SearchType');
  $formulario->handleRequest($request);

  if($formulario->isSubmitted() && $formulario->isValid()){

    $data = $formulario->getData();
    $key = $data["key"];
    $term = $data["term"];
    $items = $em->getRepository('Item::class')->findByTerm($key, $term);
    
    return $this->render('items.html.twig', ['items' => $items]);
  
  }
  
  return $this->render('searchBar.html.twig', ['form' => $formulario->createView()]);

}

如果我去 /search 并搜索一个项目,它会将我重定向到我的项目页面,其中包含我搜索的项目。但是,如果我在使用 {{ render(controller('AppBundle:search:search')) }} 呈现的项目页面中使用搜索栏,它就不起作用了。

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    你离目标不远了。

    在你的控制器上,你可以更新你的代码来处理传入的请求:

    public function searchAction(Request $request){
    
        $formulario = $this->createForm('AppBundle\Form\SearchType');
        $formulario->handleRequest($request);
    
        if ($formulario->isSubmitted() && $formulario->isValid()) {
             $data = $formulario->getData();
    
             // ... perform some action, such as saving the data to the database or search         
         }
    
        return $this->render('searchBar.html.twig', ['form' => $formulario->createView()]);
    }
    

    你可以在这里找到更多关于Processing Forms的信息

    要搜索您的数据库,您可以处理与数据对应的存储库。有关这方面的更多信息,您可以前往Symfony Doctrine documentation

    更进一步,有一个捆绑包可以简化搜索表单的管理:Lexik Form Filter Bundle

    【讨论】:

    • 感谢您的帮助。如何使用 getData() 函数获取输入字段的值?我也试过 $data = $formulario->get('element_name');但我无法得到它。
    • 另外表单好像没有提交,请问怎么查?
    • 您在使用 Symphony 调试器/分析器吗? symfony.com/doc/current/profiler.html
    • 是的,当我进行搜索时,我会在底部托盘上收到帖子确认,但由于我在 if 语句中尝试的任何代码都不起作用,所以请求没有提交。我也尝试过设置到 searchAction 的路由,所以如果我去 /search 并做同样的事情,请求会提交,我可以检索项目并将它们发送到我的项目页面使用 return $this->render( 'items.html.twig', ['items' => $items]) 但我希望能够做同样的事情,但在我的项目页面中使用搜索表单。
    • 更新:如果有人遇到同样的问题,我忘了为表单添加操作。在 searchType 中,只需添加 $builder->setAction('/search') 即可解决问题。
    猜你喜欢
    • 2021-01-03
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    相关资源
    最近更新 更多