【问题标题】:Symfony error when implementing a recursive function实现递归函数时出现 Symfony 错误
【发布时间】:2017-04-06 05:02:48
【问题描述】:

我正在尝试实现一个对数组进行递归操作的控制器。 代码如下:

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

我怎样才能使它在这个例子中工作?

【问题讨论】:

  • 你能用$this->printTree代替printTree试试
  • @Matteo 没有任何变化

标签: php symfony oop recursion


【解决方案1】:

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

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

您还可以在每次递归调用时获取所有实体:这可能效率极低。

【讨论】:

    【解决方案2】:

    尝试在递归函数之间分离函数控制器动作函数,如下所示:

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

    希望有帮助

    【讨论】:

      猜你喜欢
      • 2016-11-14
      • 2021-03-13
      • 2021-02-25
      • 2020-05-28
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多