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

Php 如何获取Symfony2应用程序的根目录?,php,symfony,symfony-2.8,symfony-config-component,Php,Symfony,Symfony 2.8,Symfony Config Component,从控制器内部获取根应用程序目录的最佳方法是什么?是否可以将其置于控制器之外 现在我通过将它(从参数)作为参数传递给服务来获得它,如下所示: services: sr_processor: class: Pro\Processor arguments: [%kernel.root_dir%] parameters: database_path: '%kernel.root_dir%/../var/sqlite3.db' 是否有更好、更简单的方法

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

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

services:

    sr_processor:
        class: Pro\Processor
        arguments: [%kernel.root_dir%]
parameters:
    database_path: '%kernel.root_dir%/../var/sqlite3.db'

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

更新2018-10-21:

截至本周,
getRootDir()
已被弃用。请改用
getProjectDir()
,正如Muzaraf Ali在评论部分所建议的那样

--

使用以下命令:

$this->get('kernel')->getRootDir();
如果您想要网页根目录:

$this->get('kernel')->getRootDir() . '/../web' . $this->getRequest()->getBasePath();
这将从控制器的操作方法

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

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

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

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

services:

    sr_processor:
        class: Pro\Processor
        arguments: [%kernel.root_dir%]
parameters:
    database_path: '%kernel.root_dir%/../var/sqlite3.db'
这个参数可以被注入到您需要的任何地方,这样您就不必再在代码中弄乱路径了。此外,可以在部署时覆盖该参数。最后,每个维护程序员都会更好地了解您使用它的目的

更新: 固定了kernel.root\u dir常量用法。

您可以使用

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

要获取web/project根目录。

自Symfony 3.3以来,您可以使用绑定,如

services:
_defaults:
    autowire: true      
    autoconfigure: true
    bind:
        $kernelProjectDir: '%kernel.project_dir%'
之后,您可以在任何控制器或服务中使用参数$kernelProjectDir。就像

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

您的解决方案是最好的。对于Symfony 3.3及以后的版本,您将再次混合使用服务和控制器。请使用
%kernel.project\u dir%
访问项目的根目录。请确保用引号将文本封装:
[%kernel.root\u dir%]
+1,但对于symfony2来说,这并不准确。改为使用:
$this->get('kernel')->getRootDir()。/$此->getRequest()->getBasePath()此解决方案仅适用于控制器。这里的问题是关于服务。不管怎样,为什么只为了得到一个变量而传递整个容器呢?最好只传递%kernel.root\u dir%Massimiliano是正确的,另外,我在控制器中使用
$this->container->getParameter('kernel.cache\u dir')
,而不是您提供的解决方案。这更多的是关于您的服务有
容器
注入:)的主题,如果您遵循最佳实践,应不惜一切代价避免注入
容器
。至于获取
web
目录的解决方案,我仍然使用上面提供的解决方案;)从Symfony 3.3及以后版本开始,使用
%kernel.project\u dir%/web/
而不是
%kernel.root\u dir%/../web/