我认为问题在于我如何在控制器内调用我的搜索服务。如果我将它直接放入我的控制器中,独立搜索方法就可以正常工作。
如果我在$ results(来自搜索类)上进行转储,我可以看到搜索功能正在按预期工作。然而,当我在我的控制器中调用它并将其传递给树枝时,它不起作用并且空白。
旁注:当我传入'查询'for for for循环{%for result in query%}时,如果尝试使用'results'而出现空白,则会出现以下错误:
“无法访问AcmeProjectBundle中字符串变量(”练习“)的属性(”标题“):默认:第25行的search.html.twig”“。
config.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,
);
}
}
SearchAction控制器
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,
));
}
search.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 %}
答案 0 :(得分:2)
因此,在您的SearchController
和SearchAction
方法中,您可以
$results = $query->search();
但是在你的Search
类中,你返回一个数组而不是$results
,然后你在控制器中以相同的方式返回它
搜索课程(服务)
return array(
'query' => $query,
'results' => $results,
);
<强> SearchController 强>
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'],
));
答案 1 :(得分:1)
搜索:搜索返回一个关联数组,其中包含两个键&#39; query&#39;和&#39;结果&#39;。 您将此数组作为返回值传递给另一个关联数组中的twig,其中包含两个键&#39; query&#39;和&#39;结果&#39;为了&#39;结果&#39;。
所以你的数组在twig中看起来像
array {
'query' => [Search instance]
'results' => array(
'query' => [Query instance]
'results' => [results]
)
}
在foreach循环中,您需要以这种方式访问results.results。
我不认为你需要在twig中使用Search类实例或Query实例,所以也许只是从搜索方法中返回结果数组,并将它们传递给twig,所以请根据&#39;结果&使用你的foreach #39;在foreach期间只需使用result.title等访问单个成员?