如何获取Symfony2应用程序的根目录?


121

从控制器内部获取根应用程序目录的最佳方法是什么?是否可以在控制器外部获取它?

现在,我通过将其(从参数)作为参数传递给服务来获得它,如下所示:

services:

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

在Symfony2中是否有更好,更简单的方法来获取此信息?


13
您的解决方案是最好的
Inoryy 2012年

4
您将服务和控制器混合在一起
约翰·史密斯

4
再次针对Symfony 3.3及更高版本,使用%kernel.project_dir%它可以进入您的项目的根目录。
Muzafar Ali

1
确保将文字用引号引起来: ["%kernel.root_dir%"]
ochitos

Answers:


220

更新2018-10-21:

从本周开始,getRootDir()已弃用。getProjectDir()如Muzaraf Ali的评论部分所建议,请改为使用。

---

用这个:

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

如果您想要网络根目录:

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

这将从控制器动作方法开始工作...

编辑:至于服务,我认为您做的方式尽可能的简洁,尽管我会将完整的内核服务作为参数传递...但这也可以解决问题...


3
+1,但对于symfony2不准确。改用:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
塞巴斯蒂安

36
此解决方案仅适用于控制器。这里的问题是关于服务的。无论如何,为什么要传递整个容器只是为了获得变量?这是更好的通过仅仅%kernel.root_dir%
的Massimiliano Arione

2
Massimiliano是正确的,此外,我$this->container->getParameter('kernel.cache_dir')在控制器中使用而不是您提供的解决方案
missovic10 2014年

2
这更多是关于container注入服务的主题:)如果遵循最佳实践,container则应不惜一切代价避免注入。至于获取web目录的解决方案,我仍然使用上面提供的;)
Jovan Perovic

4
因为symfony 3.3及以后的使用%kernel.project_dir%/web/,而不是%kernel.root_dir%/../web/
Muzafar阿里


8

如果您使用此路径访问非代码项目的一部分(例如,上载目录或SQLite数据库),则最好将路径转换为参数,如下所示:

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

这个参数可以注入到您需要的任何地方,因此您不必再弄乱代码中的路径。此外,可以在部署时覆盖该参数。最后,每个维护程序员都会对您的用途有一个更好的了解。

更新:修复了kernel.root_dir常量用法。


6

除此以外,您还可以使用正则表达式:

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

2

从Symfony 3.3开始,您可以使用绑定,例如

services:
_defaults:
    autowire: true      
    autoconfigure: true
    bind:
        $kernelProjectDir: '%kernel.project_dir%'

之后,您可以在任何控制器或服务中使用参数$ kernelProjectDir。就像

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.