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

从控制器内部获取根应用程序目录的最佳方法是什么?有没有可能让它离开控制器?

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

services:


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

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

164714 次浏览

更新2018-10-21:

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

ーー

用这个:

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

如果你想要 根:

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

这将工作从控制器的行动方法..。

编辑: As for the services, I think the way you did it is as clean as possible, although I would pass complete kernel service as an argument... but this will also do the trick...

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

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

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

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

这个参数可以被注入到任何你需要的地方,这样你就不必在你的代码中乱搞路径了。此外,可以在部署时重写该参数。最后,每个维护程序员都会更好地了解您使用它来做什么。

更新: 固定的 kernel.root _ dir 常量使用。

在 Symfony 3.3 中,你可以使用

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

获得 web/project root。

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

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

After that you can use parameter $kernelProjectDir in any controller OR service. Just like

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