126

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

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

services:

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

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

4

5 回答 5

222

2018 年 10 月 21 日更新:

截至本周,getRootDir()已弃用。请getProjectDir()按照 Muzaraf Ali 在评论部分的建议使用。

——

用这个:

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

如果你想要网络根:

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

这将通过控制器操作方法工作......

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

于 2012-02-09T17:34:48.950 回答
16

在 Symfony 3.3中,您可以使用

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

获取网络/项目根目录。

于 2017-09-21T11:37:29.137 回答
8

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

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

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

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

于 2016-08-25T18:18:49.313 回答
7

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

    $directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/yourbundle/';
    $directoryPath = preg_replace("/app..../i", "", $directoryPath);
    echo $directoryPath;
于 2015-01-20T16:18:10.147 回答
3

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

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

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

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
于 2019-09-20T09:44:02.940 回答