2016-11-22 2 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

вы можете попробовать '$ this-> printTree' вместо' printTree' – Matteo

+0

@Matteo Ничего не меняется – Dygne

ответ

1

Аргументы действия контроллера обычно являются параметрами маршрута. Итак, что вы хотите вставить в URL после /printTree/ как {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; 
} 

Надежда эта помощь

Смежные вопросы