2016-10-31 37 views
1

我做了一個控制器,一個路由,並試圖默認值時,控制器代碼:symfony的3.1路由{佔位符}默認值

class luckynumber extends Controller 
{ 
    /** 
    * Matches /lucky/number exactly 
    * 
    * @Route("/lucky/number", name="lucky_number") 
    */ 
    public function numberAction() 
    { 
     $number = rand(1, 100); 

     return $this->render('lucky/number.html.twig', array('number' => $number)); 
    } 

    /** 
    * Matches /lucky/number/{choised} exactly 
    * 
    * @Route("/lucky/number/{choised}", name="choised_number", requirements={"choised":"\d+"}) 
    */ 
    public function undernumberAction(Request $request, $choised = 7) 
    { 
     $numberList = array(); 
     for($i = 0; $i < $choised; $i++) { 
      $numberList[] = rand(1,100); 
     } 

     $final_list = implode('-', $numberList); 

     return $this->render('lucky/choised_number.html.twig', array(
      'number' => $choised, 
      'list' => $final_list 
     )); 
    } 
} 

問題是,當我去http://localhost:8000/lucky/number/它告訴我:找不到「GET/lucky/number /」的路由 這裏有什麼問題?

+1

'/幸運/ number':這是相匹配的第二路徑(默認值)的有效途徑,但他的第一條路線首先匹配相同的路徑(通過禁用第一條路線來測試它),因此您可以合併這兩個操作來實現它。 – yceruto

+0

我嘗試過,現在當我嘗試獲取** /幸運/數字**時,它使用默認值,但如果我嘗試調用**/lucky/number/**,它會再次給我同樣的錯誤? –

+1

是的,'/ lucky/number /'不是用缺省值工作的有效路徑,通配符要求:在這種情況下,「\ d +」需要斜槓後面的數字「/ ...」,所以沒有匹配。你應該使用'/幸運/號碼',但是這也與第一條路線相匹配,所以你需要改變,因爲勝利第一。 – yceruto

回答

0

我找到解決這個問題的唯一方法是從枝文件,它是這樣的:

<ul> 
<li><a href="/lucky/number">lucky number</a></li> 
<li><a href="/lucky/number/7">choised lucky number </a></li> 
</ul> 
1

您需要在@Route()註解選項添加默認值,而不是在方法參數。

@Route("/lucky/number/{choised}", name="choised_number", requirements={"choised":"\d+"}, defaults={"choised":7})

更多信息,請參見@Route and @Method文檔。

+0

試過了,仍然是同樣的錯誤 –

+0

確保您沒有遇到如下所述的尾部斜槓問題:http://www.sobstel.org/blog/symfony-routing-with-and-without-trailing-slashes/。我的答案中的路由註釋在我自己的測試中按預期工作,但由於Symfony路由,您無法訪問以尾部斜線結尾的URL。 – Malcolm

+0

這篇文章是關於symfony 2,我正在使用symfony 3.1 –

0

您可以添加2個註釋是這樣的:

/** 
* @Route("/blog", defaults={"page"=1}) 
* @Route("/blog/{$page}", name="blog_list", requirements={"page"="|d+"}) 
*/ 
public function list($page) 
{ 
    return new Response('<html><body>Welcome to my Blog'.$page.'</body></html>'); 
} 

我使用Symfony的3.4