2015-06-20 107 views
0

这里在indexAction我必须打电话给subcat函数递归获取类别和子类别的列表,否则它不起作用。PHP Silex如何使用递归?

注意subcat自称。

如何在indexAction之外编写subcat函数?并从内部呼叫IndexAction。这样做,我可以重复使用subcat

class ItemsController implements ControllerProviderInterface { 
    public function connect(Application $app) { 
     $controllers = $app['controllers_factory']; 

     $controllers 
     ->get('/', array($this, 'indexAction')) 
     ->bind('items_index'); 

     return $controllers; 
    } 

    public function indexAction(Application $app) { 
     $categorias = array(); 

     function subcat($idPadre, array & $categorias, $app) { 
      $sql = 'SELECT id, categoria FROM categorias' . 
       ' WHERE id_padre=' . $idPadre . 
       ' ORDER BY categoria'; 
      $query = $app['db']->fetchAll($sql); 

      foreach ($query as $valor) { 
       $a = subcat($valor['id'], $categorias, $app); 
       $lista[$valor['id'].'-'.$valor['categoria']] = $a; 
      } 

      return $lista; 
     }; 

     $estructura = subcat(0, $categorias, $app); 
     print_r($estructura); 
     return ''; 
    }  
} 

回答

0

您可以将可重用代码注册为服务。如果您发现任何你所需要的:LINK

+0

感谢您的信息! – Guillermo

+0

它为我工作! – Guillermo

0

我解决了这个做服务,其中$应用[“Categorias.lista”]包含所有类别:

$app['Categorias.idPadre'] = 0; 
$app['Categorias.lista'] = ''; 
$app['Categorias'] = $app->share(function ($app) { 
    function subcat($idPadre, $app) { 
     $sql = 'SELECT id, categoria FROM categorias' . 
       ' WHERE id_padre=' . $idPadre . 
       ' ORDER BY categoria'; 
     $query = $app['db']->fetchAll($sql); 

     foreach ($query as $valor) { 
      $lista[$valor['id'].'-'.$valor['categoria']] = subcat($valor['id'], $app); 
     } 

     return $lista; 
    }; 

    $app['Categorias.lista'] = subcat($app['Categorias.idPadre'], $app); 
}); 

然后我在的indexAction方法测试:

$app['Categorias.idPadre'] = 0; 
$app['Categorias']; 
print_r($app['Categorias.lista']); 

和print_r的给出了这个在我的例子:

Array 
(
    [2-capacitor] => Array 
     (
      [14-ceramico] => 
      [12-electrolitico] => 
      [13-multicapa] => 
      [16-polipropileno] => 
      [15-polyester] => 
     ) 

    [3-circuito impreso] => 
    [4-diodo] => 
    [1-resistencia] => Array 
     (
      [11-ceramica] => 
      [5-metal] => Array 
       (
        [8-1W] => 
        [9-2W] => 
        [10-3W] => 
        [7-mini] => 
       ) 

     ) 

    [20-teclado] => 
    [21-transformador] => 
    [17-transistor] => Array 
     (
      [18-bipolar] => 
      [19-mosfet] => 
     ) 

) 
0

你所要做的就是在你的ItemsController中使你的内部函数成为一个私有函数。

class ItemsController implements ControllerProviderInterface { 
    public function connect(Application $app) { 
     $controllers = $app['controllers_factory']; 

     $controllers 
     ->get('/', array($this, 'indexAction')) 
     ->bind('items_index'); 

     return $controllers; 
    } 

    public function indexAction(Application $app) { 
     $categorias = array(); 

     $estructura = $this->subcat(0, $categorias, $app); 
     print_r($estructura); 
     return ''; 
    } 

    private function subcat($idPadre, array & $categorias, $app) { 
     $sql = 'SELECT id, categoria FROM categorias' . 
      ' WHERE id_padre=' . $idPadre . 
      ' ORDER BY categoria'; 
     $query = $app['db']->fetchAll($sql); 

     foreach ($query as $valor) { 
      $a = $this->subcat($valor['id'], $categorias, $app); 
      $lista[$valor['id'].'-'.$valor['categoria']] = $a; 
     } 

     return $lista; 
    } 
} 
+0

谢谢!我确信我尝试了这一点,并不工作,不知道为什么,很简单,但会再试一次并发布结果 – Guillermo

+0

它不起作用,如果我在subcat中编写简单的代码它的工作原理,但如果我需要使用$ app它崩溃了 – Guillermo

+0

我很确定这是有效的。我已经使用过这种模式很多次了,但我用这段代码写了一个概念证明来确保。我确定问题在别的地方。也许在'db'服务中?没有看到更多的代码是不可能的。 – Jason