Php 在symfony 2中搜索函数的最佳方法
我在我的网站上有一个搜索功能,用elasticsearch实现。 现在我有一个关于设计的小问题 我有一个带有routePhp 在symfony 2中搜索函数的最佳方法,php,symfony,search-engine,Php,Symfony,Search Engine,我在我的网站上有一个搜索功能,用elasticsearch实现。 现在我有一个关于设计的小问题 我有一个带有route/search的searchAction,它在查询字符串中接受一个参数。比如/search?术语=… 我想让结果列表可过滤,但我对实现这一点的正确设计有一些疑问 制作过滤结果列表的最佳解决方案是什么 如果我传递filter参数,我需要用当前url指定一个表单操作,并像链接一样附加当前查询字符串,对吗? 例如: 在本例中,url类似于:/search?terms=…&此过滤器=…
/search
的searchAction
,它在查询字符串中接受一个参数。比如/search?术语=…
我想让结果列表可过滤,但我对实现这一点的正确设计有一些疑问
制作过滤结果列表的最佳解决方案是什么
如果我传递filter参数,我需要用当前url指定一个表单操作,并像链接一样附加当前查询字符串,对吗?
例如:
在本例中,url类似于:/search?terms=…&此过滤器=…
在带有get参数和post过滤器的表单案例中,我需要在搜索操作中同时使用这两种类型的参数。这个好吗
相反,链接现在将在$get
请求中包含所有参数,但我不喜欢在模板中使用查询字符串构建url
最好的方法是什么?我更喜欢查询字符串中的所有参数,这将允许用户将url添加到书签或通过电子邮件发送。这取决于具体情况 1如果你不需要索引(例如SEO-GoogleBot)过滤结果页面,我认为你应该使用AJAX来实现这一点 路由:
search_result:
pattern: /search
defaults: { _controller: AcmeExampleBundle:Ajax:searchResult }
requirements:
_method: POST
search_result:
pattern: /search/{queryString}/{make}/{model}
defaults: { _controller: AcmeExampleBundle:Ajax:searchResult }
requirements:
_method: GET
JavaScript(伪代码)
当然,您不应该对url“/search”进行编码
控制器:
// src/Acme/ExampleBundle/Controller/AjaxController.php
// ...
public function searchResultAction()
{
$filters = $this->getRequest()->get('filters', array());
$searchObject = new searchObj();
// or smt like $this->get('service_name'); if you use search object as service
// you can also use entity manager
$searchObject->setQueryString($this->getRequest()->get('queryString'));
$searchObject->setFilters($filters);
return $this->render('AcmeExampleBundle:Ajax:searchResult.html.twig', array(
'records' => $searchObject->getResults()
));
}
// src/Acme/ExampleBundle/Controller/AjaxController.php
// ...
public function searchResultAction($queryString, $make, $model)
{
$filters = array('make' => $make, 'model' => $model);
$searchObject = new searchObj();
// or smt like $this->get('service_name'); if you use search object as service
// you can also use entity manager
$searchObject->setQueryString($queryString);
$searchObject->setFilters($filters);
return $this->render('AcmeExampleBundle:Ajax:searchResult.html.twig', array(
'records' => $searchObject->getResults()
));
}
当然,您可以返回json响应,但在我看来,返回准备注入模板的一部分是最容易管理的
和视图:
{% for record in records %}
<div class="record">{{ record.title }}</div>
{% endfor %}
控制器:
// src/Acme/ExampleBundle/Controller/AjaxController.php
// ...
public function searchResultAction()
{
$filters = $this->getRequest()->get('filters', array());
$searchObject = new searchObj();
// or smt like $this->get('service_name'); if you use search object as service
// you can also use entity manager
$searchObject->setQueryString($this->getRequest()->get('queryString'));
$searchObject->setFilters($filters);
return $this->render('AcmeExampleBundle:Ajax:searchResult.html.twig', array(
'records' => $searchObject->getResults()
));
}
// src/Acme/ExampleBundle/Controller/AjaxController.php
// ...
public function searchResultAction($queryString, $make, $model)
{
$filters = array('make' => $make, 'model' => $model);
$searchObject = new searchObj();
// or smt like $this->get('service_name'); if you use search object as service
// you can also use entity manager
$searchObject->setQueryString($queryString);
$searchObject->setFilters($filters);
return $this->render('AcmeExampleBundle:Ajax:searchResult.html.twig', array(
'records' => $searchObject->getResults()
));
}
将KNP paginator bundle与搜索操作一起使用。在搜索表单上,将post操作发送到控制器中的searchAction,并在使用匹配条件对数据进行排序后,重新呈现页面
// src/Acme/ExampleBundle/Controller/AjaxController.php
// ...
public function searchResultAction($queryString, $make, $model)
{
$filters = array('make' => $make, 'model' => $model);
$searchObject = new searchObj();
// or smt like $this->get('service_name'); if you use search object as service
// you can also use entity manager
$searchObject->setQueryString($queryString);
$searchObject->setFilters($filters);
return $this->render('AcmeExampleBundle:Ajax:searchResult.html.twig', array(
'records' => $searchObject->getResults()
));
}
public function searchAction(Request $request,array $arguments = array())
{
$em = $this->getDoctrine()->getManager();
$paginator = $this->get('knp_paginator');
$parameter = $request->get('board_search');
$boardRepo = $this->getDoctrine()->getRepository('PNCMISDashboardBundle:ExaminationBoards')->loadBoardByName($parameter);
$boards = $paginator->paginate($boardRepo, $this->get('request')->query->get('page', 1), 10);
return $this->render('PNCMISDashboardBundle:ExaminationBoards/CRUD:index.html.twig', array(
'boards'=> $boards,
)
);
}
public function loadBoardByName($name)
{
$q = $this
->createQueryBuilder('boards')
->where('upper(boards.name) LIKE upper(:search)')
->setParameter('search', '%'.$name.'%')
->getQuery()
;
try {
// The Query::getSingleResult() method throws an exception
// if there is no record matching the criteria.
$user = $q->getResult();
} catch (NoResultException $e) {
throw new UsernameNotFoundException(sprintf('Unable to find an board identified by "%s".', $name), null, 0, $e);
}
return $user;
}