2016-11-22 13 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). 

私は他の同様の問題のためのウェブサイトを通じて検索は、問題はDoctrineの注釈、プレースホルダ内にあるように見えます必要です。 私は、たとえば書く場合:

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

は、どのように私はそれがこの例で作業することができますか?

+0

あなたの代わりに 'printTree' – Matteo

+0

@Matteoの'ます$ this-> printTree'で試すことができます何も変わらない – 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; 
} 

・ホープ、このヘルプ