2014-09-17 17 views
6

Come elenco tutti i controller/azioni sul mio sito? Configure :: listObjects ('model') non sembra più esistere. Sto cercando di scrivere una funzione per generare/aggiungere agli ACO nella mia configurazione ACL. Grazie.Elenca tutti i controller/azioni in Cakephp 3

risposta

1

Non sembra nulla di simile a questo è ancora disponibile in Cake3, né è ancora necessario a causa degli spazi dei nomi che penso.

Così, in breve si può provare a fare questo:

  • Leggi tutti i controller dalla cartella regolatore di livello applicazione
  • Leggi tutte le cartelle del controller plug-in (Prendi la cartella plugin tramite Plugin::path())
  • iterare i controller che hai raccolto nei passaggi precedenti (Dovrai utilizzare App :: uses())
  • Utilizzare reflections per ottenere i metodi pubblici da ciascun controller
8

Quindi ecco cosa ho fatto. Nel mio Resource Controller:

includere le librerie di classe di riflessione/Metodo

use ReflectionClass; 
use ReflectionMethod; 

Per ottenere i controllori:

public function getControllers() { 
    $files = scandir('../src/Controller/'); 
    $results = []; 
    $ignoreList = [ 
     '.', 
     '..', 
     'Component', 
     'AppController.php', 
    ]; 
    foreach($files as $file){ 
     if(!in_array($file, $ignoreList)) { 
      $controller = explode('.', $file)[0]; 
      array_push($results, str_replace('Controller', '', $controller)); 
     }    
    } 
    return $results; 
} 

E ora per le azioni:

public function getActions($controllerName) { 
    $className = 'App\\Controller\\'.$controllerName.'Controller'; 
    $class = new ReflectionClass($className); 
    $actions = $class->getMethods(ReflectionMethod::IS_PUBLIC); 
    $results = [$controllerName => []]; 
    $ignoreList = ['beforeFilter', 'afterFilter', 'initialize']; 
    foreach($actions as $action){ 
     if($action->class == $className && !in_array($action->name, $ignoreList)){ 
      array_push($results[$controllerName], $action->name); 
     } 
    } 
    return $results; 
} 

Infine, legarli insieme:

public function getResources(){ 
    $controllers = $this->getControllers(); 
    $resources = []; 
    foreach($controllers as $controller){ 
     $actions = $this->getActions($controller); 
     array_push($resources, $actions); 
    } 
    return $resources; 
} 

Spero che questo aiuti alcune persone.

0

Sto usando CakePHP 3.xe avuto problemi con la funzione "getActions"

La sintassi corretta per "ReflectionClass" e "ReflectionMethod" è:

public function getActions($controllerName) { 

    $className = 'App\\Controller\\'.$controllerName.'Controller'; 

    $class = new \ReflectionClass($className); 

    $actions = $class->getMethods(\ReflectionMethod::IS_PUBLIC); 

    $results = [$controllerName => []]; 

    $ignoreList = ['beforeFilter', 'afterFilter', 'initialize']; 

    foreach($actions as $action){ 
     if($action->class == $className && !in_array($action->name, $ignoreList)){ 
      array_push($results[$controllerName], $action->name); 
     } 
    } 
    return $results; 
} 

Attenzione per "\" prima ReflectionClass e ReflectionMethod.