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无任何更改吗