從控制器內部獲取根應用程序目錄的最佳方式是什麼?是否有可能將其置於控制器之外?如何獲得Symfony2應用程序的根目錄?
現在,我通過它傳遞(從參數)的服務作爲參數得到它,就像這樣:
services:
sr_processor:
class: Pro\Processor
arguments: [%kernel.root_dir%]
是否還有更好的,更簡單的方式來獲得在Symfony2的這一信息?
從控制器內部獲取根應用程序目錄的最佳方式是什麼?是否有可能將其置於控制器之外?如何獲得Symfony2應用程序的根目錄?
現在,我通過它傳遞(從參數)的服務作爲參數得到它,就像這樣:
services:
sr_processor:
class: Pro\Processor
arguments: [%kernel.root_dir%]
是否還有更好的,更簡單的方式來獲得在Symfony2的這一信息?
使用此:
$this->get('kernel')->getRootDir();
如果你想在網絡根:
$this->get('kernel')->getRootDir() . '/../web' . $this->getRequest()->getBasePath();
這會從控制器的操作方法工作...
編輯: 至於服務,我認爲你做到的方式儘可能的乾淨,儘管我會通過完整的內核服務作爲一個參數......但是S還會做的伎倆......
+1但對symfony2不準確。改爲使用:'$ this-> get('kernel') - > getRootDir()。 '/../ ..'。 $ this-> getRequest() - > getBasePath();' – Sebastian 2013-08-26 06:12:01
你確定嗎?我已經在'2.0' - >'2.2'中成功使用了這個代碼。在'2.3'或'master'中改變了目錄結構嗎? – 2013-08-26 09:43:15
該解決方案僅適用於控制器。這裏的問題是關於服務。無論如何,爲什麼要傳遞* whole *容器來獲得變量?只需傳遞%kernel.root_dir% – 2013-09-10 09:06:12
您還可以使用除了正則表達式是:
$directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/yourbundle/';
$directoryPath = preg_replace("/app..../i", "", $directoryPath);
echo $directoryPath;
如果您正在使用此路徑訪問它不是代碼項目的部分(例如上傳目錄,或SQLite數據庫),那麼它可能會更好把道路變成一個參數,像這樣:
parameters:
database_path: '%kernel.root_dir%/../var/sqlite3.db'
此參數可以隨處注入你需要它,所以你不必亂您的代碼中還有路徑。另外,該參數可以在部署時被覆蓋。最後,每個維護程序員都會更好地瞭解您使用的是什麼。
更新: 修復了kernel.root_dir的不斷使用。
謝謝!我喜歡閱讀發行說明的人))) – 2017-10-28 18:18:14
你的解決方案是最好的 – Inoryy 2012-02-10 08:34:52
youre混合了一個服務和一個控制器喲 – 2014-05-09 18:51:58
再次爲Symfony 3.3及以上使用'%kernel.project_dir%'得到您的項目的根。 – 2017-08-21 02:56:25