如何从控制器内部获取Symfony2中web目录的服务器路径


How to get the server path to the web directory in Symfony2 from inside the controller?

问题如下:

我如何从控制器内部(或出于这个原因从其他任何地方)获得Symfony2中web目录的服务器路径

我已经找到了什么(同样,通过在这里搜索):

这在关于条令文件处理的烹饪书文章中得到了建议

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

通过四处搜索找到,只能从控制器内部使用(或注入内核的服务):

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

那么,是不是绝对没有办法至少获得这条道路的"网络"部分?例如,如果我决定重命名它或移动它或其他什么,该怎么办?

在第一个symfony中,一切都很容易,那时我可以通过调用静态sfConfig::get()方法从代码中的任何地方获得所需的一切。。

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

您可以在内核类的实例上使用getRootDir(),就像编写一样。如果将来考虑重命名/web目录,则应该使其可配置。例如,AssetBundle在其DI配置中有这样一个选项(请参阅此处和此处)。

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

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

然后您可以在类构造函数中获取web根:

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

您也可以从请求服务的任何Containerware(f.i.Controller)类获得它:

  • 如果您使用apache作为Web服务器(我想对于其他解决方案类似的Web服务器),并且正在使用虚拟主机(你的url看起来像这样-localhost/app.php,然后你可以使用:

    $container->get('request')->server->get('DOCUMENT_ROOT');
    // in controller:
    $this->getRequest()->server->get('DOCUMENT_ROOT');
    
  • 否则(你的网址是这样的-localhost/path/to/Symfony/web/app.php:

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

你在Symfony上,想想"依赖注入"^^

在我所有的SF项目中,我都使用parameters.yml:

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

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

$this->getParameter('web_dir');

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

define('WEB_DIRECTORY', __DIR__);

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

另一个解决方案可能是在AppKernel中添加一个静态方法,该方法返回DIR.//web/'因此,您可以访问任何位置的

UPDATE:自2.8以来,由于默认情况下不再包含assetic,因此不再有效。尽管如果你使用的是assetic,这是可行的。

您可以使用变量%assetic.write_to%.

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

由于您的资产依赖于这个变量来转储到您的web目录,因此可以安全地假设并使用它来定位您的web文件夹。

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

对于Symfony3在控制器中尝试

$request->server->get('DOCUMENT_ROOT').$request->getBasePath()
$host = $request->server->get('HTTP_HOST');
$base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : '';
$getBaseUrl = $host.$base;

由于Symfony 3.3,

您可以使用%kernel.project_dir%/web/而不是%kernel.root_dir%/../web/