2016-11-22 60 views
2

我試圖實現一個控制器,該控制器對數組進行遞歸操作。 下面是代碼:執行遞歸函數時出現Symfony錯誤

  /** 
     * @Route("/printTree", name="printTree") 
     */ 
     public function printTree(array $elements, $parentId = 0) { 

      $em = $this->getDoctrine()->getManager(); 
      $elements = $em->getRepository('AppBundle:Tree')->findAll(); 

      $treeArray = array(); 

      foreach ($elements as $element) { 
       if ($element['parent_id'] == $parentId) { 
        $children = printTree($elements, $element['id']); 
        if ($children) { 
         $element['children'] = $children; 
        } 
        $treeArray[] = $element; 
       } 
      } 


      return $treeArray; 
     } 

這是我的錯誤:我通過網站爲其他類似問題搜索

Controller "AppBundle\Controller\DefaultController::printTree()" requires that you provide a value for the "$elements" argument (because there is no default value or because there is a non optional argument after this one). 

,這個問題似乎是在教義的註解,其中佔位符是必要的。 如果我寫例如:

 /** 
    * @Route("/printTree/{$elements}/{0}", name="printTree") 
    */ 

我怎樣才能使它在這個例子中工作?

+0

你可以嘗試用'$這個 - > printTree',而不是'printTree' – Matteo

+0

@Matteo沒有什麼變化 – Dygne

回答

1

控制器動作參數通常是路由的參數。那麼,你想在/printTree/之後的URL中插入什麼作爲{elements}參數?

有解決方法,但我建議只將樹遍歷到一個單獨的地方:一些私人的控制器或一些其他服務的方法。保持控制器很薄。

此外,您還可以在每次遞歸調用時獲取所有實體:它可能效率極低。

0

嘗試如下分離遞歸函數的功能控制器操作功能:

/** 
    * @Route("/printTree", name="printTree") 
    */ 
    public function printTree() { 
     return $this->recursivePrintTree(); 
    } 

    private function recursivePrintTree(array $elements= array(), $parentId = 0) 
    { 
     $em = $this->getDoctrine()->getManager(); 
     $elements = $em->getRepository('AppBundle:Tree')->findAll(); 

     $treeArray = array(); 

     foreach ($elements as $element) { 
      if ($element['parent_id'] == $parentId) { 
       $children = $this->recursivePrintTree($elements, $element['id']); 
       if ($children) { 
        $element['children'] = $children; 
       } 
       $treeArray[] = $element; 
      } 
     } 


     return $treeArray; 
} 

希望這有助於