Symfony2 - 使搜索方法作为服务工作时遇到问题


Symfony2 - Trouble getting search method working as a service

我相信问题在于我如何在控制器中调用我的搜索服务。如果我将独立搜索方法直接放入控制器中,则该方法工作正常。

如果我对$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 %}
所以

,在你的SearchControllerSearchAction方法中,你做

$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 等等?