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

时间:2012-02-09 17:30:00

标签: symfony

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

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

services:

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

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

5 个答案:

答案 0 :(得分:215)

更新2018-10-21:

截至本周,getRootDir()已被弃用。请使用getProjectDir()代替,如Muzaraf Ali的评论部分所示。

-

使用此:

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

如果你想要 web root:

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

这将来自控制器动作方法......

编辑: 至于服务,我认为你做的方式尽可能干净,虽然我会把完整的内核服务作为一个参数...但这也可以解决问题......

答案 1 :(得分:14)

In Symfony 3.3您可以使用

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

获取Web /项目根目录。

答案 2 :(得分:8)

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

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

此参数可以在您需要的任何地方注入,因此您不必再烦扰代码中的路径。此外,可以在部署时覆盖该参数。最后,每个维护程序员都会更好地了解您使用它的目的。

更新: 修复了kernel.root_dir常量使用情况。

答案 3 :(得分:6)

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

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

答案 4 :(得分:1)

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

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

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

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