2013-02-15 50 views
0

我正在尋找一種方式來獲得編程在Kohana的應用程序控制器的列表中。列表Kohana的控制器

喜歡的東西:

public function build_site_map(){ 
    $controllers = Kohana::get_controllers(); 

    echo '<ul>'; 
    foreach($controllers as $controller){ 
     echo '<li><a href="'.URL::base().$controller.'">'.$controller.'</a></li>'; 
    } 
    echo '</ul>'; 
} 

我知道我可以讀/應用/班/控制器/目錄,但我希望有一個更簡單的方法。

感謝,

回答

1

入門控制器的文件列表可以用Kohana::list_files('classes/controller')來完成。但正如米哈爾所說,控制者/行動與路線之間並不存在1:1的關係。

0

恐怕沒有Kohana::get_controllers()方法即可輕鬆調用來獲得各種各樣的站點地圖。這是因爲控制器基於該請求的URL和路由配置的Kohana的檢查的控制器(和動作)是否存在,然後調用它們動態調用,即。 Kohana不記錄所有可用的控制器和可以訪問的操作。

無論是穿越/application/classes/controllers目錄,並獲得所有文件的清單會給你想要的結果,因爲不僅要讀的動作(可以很容易地與Reflection class完成),但也有Routes你必須考慮到。

正如你可以看到這是潛在的非常複雜的問題,一個不能用的代碼片段,可以粘貼在這裏可以很簡單地回答。

如果您決定寫這實際上會創建這樣一張地圖的腳本,但你跌入的方式有問題,我們將能夠更多的幫助,然後否則這個問題太開放了。另外,如果您要編寫它,我建議您將它創建爲一個模塊,您可以將其包含在任何其他項目中並共享它。

0

這裏我的解決方案,使所有的控制器和他們的行動。我用它來爲我們的系統添加權限https://github.com/open-classifieds/openclassifieds2/

/** 
* get all the controllers and the actions that can be used 
* @return array 
*/ 
public static function list_controllers() 
{ 
    $list_controllers = array(); 

    $controllers = Kohana::list_files('classes/controller'); 

    foreach ($controllers as $controller) 
    { 
     $controller = basename($controller,'.php'); 
     $list_controllers[] = $controller; 

     $class  = new ReflectionClass('Controller_Panel_'.$controller); 
     $methods = $class->getMethods(); 
     foreach ($methods as $obj => $val) 
     { 
      if (strpos($val->name , 'action_') !== FALSE) 
      { 
       $list_controllers[$controller][] = str_replace('action_', '', $val->name); 
      } 
     } 
    } 

    return $list_controllers; 
}