Php 实现递归函数时出现Symfony错误

Php 实现递归函数时出现Symfony错误,php,symfony,oop,recursion,Php,Symfony,Oop,Recursion,我试图实现一个在数组上操作递归的控制器。 代码如下: /** * @Route("/printTree", name="printTree") */ public function printTree(array $elements, $parentId = 0) { $em = $this->getDoctrine()->getManager(); $elemen

我试图实现一个在数组上操作递归的控制器。 代码如下:

         /**
         * @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")
     */

在本例中如何使其工作?

控制器操作参数通常是路由的参数。那么,您想在URL中的
/printree/
之后插入什么作为
{elements}
参数

有一些解决方法,但我建议只将树遍历移动到一个单独的位置:控制器的某个私有方法或其他服务。保持控制器精简


此外,每次递归调用都会获取所有实体:这可能效率极低。

尝试将函数控制器操作函数与递归函数分开,如下所示:

    /**
     * @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;
 }

希望此帮助

您可以尝试使用
$this->printTree
而不是
printTree
@Matteo无任何更改吗