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


How to get the root dir of the Symfony2 application?

从控制器内部获取根应用程序目录的最佳方式是什么?有可能把它放在控制器之外吗?

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

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

有没有更好、更简单的方法在Symfony2中获取这些信息?

更新2018-10-21:

截至本周,getRootDir()已被弃用。请使用getProjectDir(),正如穆扎拉夫·阿里在评论部分所建议的那样。

---

使用此:

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

如果您想要web根:

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

这将从控制器操作方法。。。

编辑:至于服务,我认为你做的方式尽可能干净,尽管我会把完整的内核服务作为一个参数。。。但这也会起作用。。。

在Symfony 3.3中,您可以使用

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

以获取web/项目根目录。

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

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

这个参数可以被注入到任何需要的地方,所以你不必再在代码中摆弄路径了。此外,可以在部署时重写该参数。最后,每个维护程序员都会更好地了解你使用它的目的。

更新:修复了kernel.root_dir的持续使用。

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

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

由于Symfony 3.3,您可以使用绑定,如

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

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

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....