2016-11-22 61 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; 
} 

希望这有助于