【发布时间】: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')) }} 呈现的项目页面中使用搜索栏,它就不起作用了。
【问题讨论】: