我相信问题在于我如何在控制器中调用我的搜索服务。如果我将独立搜索方法直接放入控制器中,则该方法工作正常。
如果我对$results(从搜索类)进行转储,我可以看到搜索功能按预期工作。然而,当我在我的控制器中调用它并将其传递给 twig 时,它不起作用并且出现空白。
旁注:当我为 for 循环传入"查询"{% for result in query %} 时,如果尝试使用"结果"而不是,它会出现空白,我收到以下错误:
"无法访问 AcmeProjectBundle:Default:search.html.twig 第 25 行)中字符串变量("实践")上的属性("标题")"。
配置.xml
services:
search:
class: Acme'ProjectBundle'Services'Search
arguments: ["@request_stack", @doctrine]
scope: request
搜索类(服务)
class Search
{
protected $request;
public function __construct(RequestStack $requestStack, Registry $doctrine)
{
$this->request = $requestStack->getCurrentRequest();
$this->doctrine = $doctrine;
}
public function search()
{
$results = null;
$query = $this->request->query->get('q');
if (!empty($query)) {
$em = $this->doctrine->getManager();
$results = $em->createQueryBuilder()
->from('AcmeProjectBundle:Blog', 'b')
->select('b')
->where('b.title LIKE :search')
->setParameter('search', "%${query}%")
->getQuery()
->getResult();
}
// exit('Doctrine'Common'Util'Debug::dump($results));
return array(
'query' => $query,
'results' => $results,
);
}
}
搜索操作控制器
public function searchAction(Request $request)
{
// Calling from the service Search
$query = $this->get('search');
$results = $query->search();
// exit('Doctrine'Common'Util'Debug::dump($query));
return $this->render('AcmeProjectBundle:Default:search.html.twig', array(
'query' => $query,
'results' => $results,
));
}
搜索.html.twig
{% block search %}
<form action="{{ path('acme_project_search') }}" method="GET">
<label><input type="search" name="q" value={{ app.request.query.get('q') }}></label>
<input type="submit" value="Search">
</form>
<br>
{% endblock %}
{% block body %}
{% for result in query %}
<div class="container">
<div class="row">
<div class="col-sm-8 blog-main">
<div class="blog-post">
<h2 class="blog-post-title">{{ result.title }}</h2>
<p class="blog-post-meta"><time datetime="{{ result.created|date('c') }}">{{ result.created|date('l, F j, Y') }}</time> by <a href="#">{{ result.author }}</a></p>
<p>{{ result.blog|truncate(350, true) }}</p><br>
<div class="tags">
<p><strong>Tags: </strong><span class="highlight">{{ result.tags }}</span></p>
</div>
</div><!-- /.blog-post -->
</div>
</div>
</div>
{% endfor %}
{% endblock %}
,在你的SearchController
和SearchAction
方法中,你做
$results = $query->search();
但是在你的Search
类中,你返回一个数组而不是$results
,然后你在控制器中以同样的方式返回它
搜索类(服务)
return array(
'query' => $query,
'results' => $results,
);
搜索控制器
return $this->render('AcmeProjectBundle:Default:search.html.twig', array(
'query' => $query,
'results' => $results, // <----- this is an array already!
));
可能的解决方案
一种解决方案是只在服务中返回$results
,但这样您将错过查询字符串
或
另一种解决方案是仅将$results
设置为Controller
中的返回参数。这边:
return $this->render('AcmeProjectBundle:Default:search.html.twig', $results));
或
此解决方案更适合于要将其他元素添加到返回数组的情况。
return $this->render('AcmeProjectBundle:Default:search.html.twig', array(
'query' => $results['query'],
'results' => $results['results'],
));
搜索:搜索返回一个具有两个键"query"和"results"的关联数组。将此数组作为返回值传递给另一个关联数组中的 twig,其中包含"结果"的两个键"查询"和"结果"。
所以你在树枝中的数组看起来像
array {
'query' => [Search instance]
'results' => array(
'query' => [Query instance]
'results' => [results]
)
}
在 foreach 循环中,您需要以这种方式访问 results.results。
我不认为,你需要 twig 中的搜索类实例或查询实例,所以也许只是从搜索方法返回结果数组,并将它们传递给 twig,所以根据"结果"使用你的 foreach 并在 foreach 期间访问单个成员只需使用 result.title 等等?