2012-02-09 64 views
109

從控制器內部獲取根應用程序目錄的最佳方式是什麼?是否有可能將其置於控制器之外?如何獲得Symfony2應用程序的根目錄?

現在,我通過它傳遞(從參數)的服務作爲參數得到它,就像這樣:

services: 

    sr_processor: 
     class: Pro\Processor 
     arguments: [%kernel.root_dir%] 

是否還有更好的,更簡單的方式來獲得在Symfony2的這一信息?

+11

你的解決方案是最好的 – Inoryy 2012-02-10 08:34:52

+4

youre混合了一個服務和一個控制器喲 – 2014-05-09 18:51:58

+2

再次爲Symfony 3.3及以上使用'%kernel.project_dir%'得到您的項目的根。 – 2017-08-21 02:56:25

回答

199

使用此:

$this->get('kernel')->getRootDir(); 

如果你想在網絡根:

$this->get('kernel')->getRootDir() . '/../web' . $this->getRequest()->getBasePath(); 

這會從控制器的操作方法工作...

編輯: 至於服務,我認爲你做到的方式儘可能的乾淨,儘管我會通過完整的內核服務作爲一個參數......但是S還會做的伎倆......

+3

+1但對symfony2不準確。改爲使用:'$ this-> get('kernel') - > getRootDir()。 '/../ ..'。 $ this-> getRequest() - > getBasePath();' – Sebastian 2013-08-26 06:12:01

+0

你確定嗎?我已經在'2.0' - >'2.2'中成功使用了這個代碼。在'2.3'或'master'中改變了目錄結構嗎? – 2013-08-26 09:43:15

+34

該解決方案僅適用於控制器。這裏的問題是關於服務。無論如何,爲什麼要傳遞* whole *容器來獲得變量?只需傳遞%kernel.root_dir% – 2013-09-10 09:06:12

6

您還可以使用除了正則表達式是:

$directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/yourbundle/'; 
    $directoryPath = preg_replace("/app..../i", "", $directoryPath); 
    echo $directoryPath; 
7

如果您正在使用此路徑訪問它不是代碼項目的部分(例如上傳目錄,或SQLite數據庫),那麼它可能會更好把道路變成一個參數,像這樣:

parameters: 
    database_path: '%kernel.root_dir%/../var/sqlite3.db' 

此參數可以隨處注入你需要它,所以你不必亂您的代碼中還有路徑。另外,該參數可以在部署時被覆蓋。最後,每個維護程序員都會更好地瞭解您使用的是什麼。

更新: 修復了kernel.root_dir的不斷使用。

5

In Symfony 3.3可以使用

$projectRoot = $this->get('kernel')->getProjectDir(); 

獲得網絡/項目的根。

+1

謝謝!我喜歡閱讀發行說明的人))) – 2017-10-28 18:18:14

相關問題