2013-12-16 62 views
0

有沒有辦法讓所有控制器(和類)的捆綁?包括所有父控制器?Symfony2 - 一種獲取包的所有控制器的方法?

感謝的

+0

[這裏我實現呈現一個選擇所有的邏輯控制器名的FormType( http://stackoverflow.com/questions/24718786/symofny2-get-a-listing-of-available-logical-controller-names)。 關心! – juanmf

+0

我很久以前就找到了解決方案;) – IgiX

回答

3

最現實的方法是獲取路線的終點。

控制器沒有文檔所要求的所需結構。一個動作方法不需要在名稱後加Action作爲後綴。這樣記錄的原因是因爲很多人在其路由yml中使用捕獲所有配置,需要後綴來猜測端點。

當你打印出來的路線:

print_r($this->container->get('router')->getRouteCollection()->all()); 

你會看到每個航線使用的控制器方法。 這些路線在技術上不屬於任何束,因爲您可以用任何類的任何方法指向路線。

但是,您可以使用列表和一些字符串魔法來根據命名空間來告訴捆綁包。

請記住,_controller就像web_profiler.controller.profiler:infoAction意味着該方法屬於通過依賴注入實例化的服務。

1

Altough沒有官方的方式來獲得控制器,你可以使用下面的代碼來獲取所有控制器:

$bundles = $this->container->getParameter('kernel.bundles'); 
$controllers = []; 
foreach ($bundles as $bundle) { 
    $reflection = new \ReflectionClass($bundle); 
    $controllerDirectory = dirname($reflection->getFileName()) . '/Controller'; 
    if (file_exists($controllerDirectory)) { 
     $d = dir($controllerDirectory); 
     while (false !== ($entry = $d->read())) { 

      if (preg_match("/^([A-Z0-9-_]+Controller).php/i", $entry, $matches)) {       
       $controllers[] = ['fileName' => $controllerDirectory. '/'. $entry, 'class' => $reflection->getNamespaceName() . '\Controller\\' . $matches[1]]; 
      } 
     } 
     $d->close(); 
    } 
} 
print_r($controllers); 
相關問題