Symfony2 - 无法使搜索方法作为服务工作

时间:2014-04-02 06:37:27

标签: php symfony search service doctrine-orm

我认为问题在于我如何在控制器内调用我的搜索服务。如果我将它直接放入我的控制器中,独立搜索方法就可以正常工作。

如果我在$ 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 %}

2 个答案:

答案 0 :(得分:2)

因此,在您的SearchControllerSearchAction方法中,您可以

$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等访问单个成员?