【问题标题】:How to get the root dir of the Symfony2 application?如何获取 Symfony2 应用程序的根目录?
【发布时间】:2012-03-02 05:05:48
【问题描述】:

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

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

services:

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

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

【问题讨论】:

  • 你的解决方案是最好的
  • 你把服务和控制器搞混了哟
  • 对于 Symfony 3.3 及更高版本,再次使用 %kernel.project_dir% 获取项目的根目录。
  • 请务必将文字用引号括起来:["%kernel.root_dir%"]

标签: php symfony symfony-2.8 symfony-config-component


【解决方案1】:

2018 年 10 月 21 日更新:

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

——

使用这个:

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

如果你想要 web 根:

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

这将在控制器操作方法中起作用...

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

【讨论】:

  • +1 但对于 symfony2 不准确。改用:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
  • 此解决方案仅适用于控制器。这里的问题是关于服务的。无论如何,为什么要传递 whole 容器只是为了获取变量?最好只传递 %kernel.root_dir%
  • Massimiliano 是对的,另外,我在控制器中使用 $this->container->getParameter('kernel.cache_dir'),而不是您提供的解决方案
  • 这更多是关于您的服务注入了container 的主题:) 如果您遵循最佳实践,则应不惜一切代价避免注入container。至于获取web目录的解决方案,我还是用我上面提供的那个;)
  • 从 Symfony 3.3 起使用%kernel.project_dir%/web/ 而不是%kernel.root_dir%/../web/
【解决方案2】:

In Symfony 3.3你可以用

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

获取网络/项目根目录。

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-10
          • 2019-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-28
          • 2011-07-28
          • 1970-01-01
          相关资源
          最近更新 更多