2014-04-02 60 views
1

我相信問題在於我如何在控制器中調用我的搜索服務。獨立搜索方法可以正常工作,如果直接將其放入我的控制器中。Symfony2 - 搜索方法無法正常工作

如果我在$ results(來自搜索類)上做轉儲,我可以看到搜索功能按預期工作。但是當我在我的控制器中調用它並將它傳遞給它時,它不起作用並且變得空白。

附註:當我通過在「查詢」的for循環{%爲結果查詢%}它出現空白,如果試圖使用「結果」,而不是我收到以下錯誤:

「無法在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

你有沒有在'app/config/config.yml'中正確設置你的服務?你能證明嗎? – ponciste

+0

當然,增加/更新。 – webdev

+0

所以這項服務運作良好?至少你可以稱它是正確的? – ponciste

回答

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服務但隨後你會錯過的查詢字符串

OR

另一種解決方案是在您的Controller中只設置$results作爲返回參數。通過這種方式:

return $this->render('AcmeProjectBundle:Default:search.html.twig', $results)); 

OR

這個解決方案是更適合的情況下,你想其他元素添加到返回的數組。

return $this->render('AcmeProjectBundle:Default:search.html.twig', array(
    'query'  => $results['query'], 
    'results'  => $results['results'], 
)); 
+0

不確定我在追蹤,我在服務的搜索()中返回$ results。我需要做什麼?在控制器中,是的,我再次返回它們,因爲它顯示在服務中。 – webdev

+0

看我的編輯。 :-) @KeefeKwan – ponciste

+0

我會建議最後的解決方案:) – ponciste

1

搜索:搜索返回與兩個鍵 '查詢' 和 '結果' 的關聯數組。 將此數組作爲返回值傳遞給另一個關聯數組,其中兩個鍵'query'和'results'爲'results'。

所以您在樹枝陣列看起來像

array { 
    'query' => [Search instance] 
    'results' => array(
     'query' => [Query instance] 
     'results' => [results] 
    ) 
} 
在foreach循環

,你將需要訪問結果。結果這種方式。

我不認爲,你需要在樹枝中搜索類實例或查詢實例,所以也許只是從搜索方法返回結果數組,並將它們傳遞給樹枝,所以使用基於'結果'的foreach和使用result.title等訪問foreach期間的單個成員?