如何从控制器中获取Symfony2中的Web目录的服务器path?

问题如下:

我怎么能从控制器(或从其他地方)的服务器path到Symfony2中的Web目录?

我已经find了(也在这里search):

在关于Doctrine文件处理的食谱文章中build议这样做

$path = __DIR__ . '/../../../../web'; 

通过searchfind,只能在控制器内部使用(或注入内核的服务):

 $path = $this->get('kernel')->getRootDir() . '/../web'; 

那么,是否绝对没有办法获得至less那个“networking”部分的path? 比如说,如果我决定重命名或移动什么的话呢?

在第一个symfony中,一切都很简单,通过调用静态的sfConfig :: get()方法,我可以从代码的任何地方得到我需要的所有东西。

在Symfony2中实际上没有直接的方法来获取webdir,因为框架完全独立于webdir。

就像你写的一样,你可以在内核类的实例上使用getRootDir() 。 如果您将来考虑重命名/web目录,则应该使其可configuration。 例如,AsseticBundle在其DIconfiguration中有这样一个选项(参见这里和这里 )。

要从控制器外部访问根目录,只需在服务configuration中注入%kernel.root_dir%作为参数即可。

 service_name: class: Namespace\Bundle\etc arguments: ['%kernel.root_dir%'] 

然后你可以在类的构造函数中获得web根目录:

 public function __construct($rootDir) { $this->webRoot = realpath($rootDir . '/../web'); } 

您也可以从请求服务中的任何ContainerAware(fi控制器)类获取它:

  • 如果你使用Apache作为一个networking服务器(我想其他的networking服务器的解决scheme将是类似的),并使用virtualhosting(你的url看起来像这样 – localhost/app.php那么你可以使用:

     $container->get('request')->server->get('DOCUMENT_ROOT'); // in controller: $this->getRequest()->server->get('DOCUMENT_ROOT'); 
  • 否则(你的url看起来像这样 – localhost/path/to/Symfony/web/app.php

     $container->get('request')->getBasePath(); // in controller: $this->getRequest()->getBasePath(); 

更新:由于2.8这不再起作用,因为资产不再是默认包含的。 虽然如果你使用资产,这将工作。

您可以使用variables%assetic.write_to%.

$this->getParameter('assetic.write_to');

由于您的资产依赖于这个variables被转储到您的Web目录,所以假设并使用它来定位您的Web文件夹是安全的。

http://symfony.com/doc/current/reference/configuration/assetic.html

我的解决scheme是将此代码添加到app.php

 define('WEB_DIRECTORY', __DIR__); 

问题是,在使用常量的命令行代码将会中断。 您也可以将常量添加到应用程序/控制台文件和其他环境前端控制器

另一个解决scheme可能是在AppKernel添加一个静态方法,返回DIR 。'/ .. / web /'所以你可以随处访问

你在Symfony上,想“dependency injection”^^

在我所有的SF项目中,我都是在parameters.yml中做的:

 web_dir: "%kernel.root_dir%/../web" 

所以我可以安全地在控制器内使用这个参数:

 $this->getParameter('web_dir'); 

对于Symfony3在你的控制器尝试

 $request->server->get('DOCUMENT_ROOT').$request->getBasePath()