2014-09-17 12 views

Trả lời

1

Nó không giống như bất cứ điều gì tương tự như thế này vẫn còn có sẵn trong Cake3, và cũng không cần thiết vì không gian tên tôi nghĩ.

Vì vậy, trong ngắn hạn, bạn có thể cố gắng để làm điều này:

  • Đọc tất cả các bộ điều khiển từ thư mục điều khiển mức độ ứng dụng
  • Đọc tất cả các thư mục controller plugin (Lấy thư mục Plugin qua Plugin::path())
  • lặp trên các bộ điều khiển bạn đã thu thập được trong các bước trước đó (Bạn cần phải sử dụng Ứng dụng :: sử dụng())
  • Sử dụng reflections để nhận các phương pháp công khai từ mỗi bộ điều khiển
8

Vì vậy, đây là những gì tôi đã làm. Trong điều khiển tài nguyên của tôi:

Bao gồm các thư viện lớp phản chiếu/phương pháp

use ReflectionClass; 
use ReflectionMethod; 

Để có được điều khiển:

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; 
} 

Và bây giờ cho các hoạt động:

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; 
} 

Cuối cùng, để buộc chúng lại với nhau:

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

Tôi hy vọng rằng sẽ giúp một số người.

0

Tôi đang sử dụng CakePHP 3.x và đã có vấn đề với chức năng "getActions"

Cú pháp chính xác cho "ReflectionClass" và "ReflectionMethod" là:

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; 
} 

Cảnh báo cho "\" trước ReflectionClass và ReflectionMethod.

Các vấn đề liên quan