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

Syl*_*vix 63 php symfony

问题如下:

如何从控制器内部(或出于该原因从任何其他地方)获取Symfony2中的Web目录的服务器路径

我已经找到了(也在这里搜索):

有关Doctrine文件处理的食谱文章中建议这样做

$path = __DIR__ . '/../../../../web';
Run Code Online (Sandbox Code Playgroud)

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

$path = $this->get('kernel')->getRootDir() . '/../web';
Run Code Online (Sandbox Code Playgroud)

那么,绝对没有办法至少获得路径中"网络"的一部分吗?例如,如果我决定重命名或移动或其他什么,该怎么办?

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

小智 47

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

你可以getRootDir()像编写一样使用内核类的实例.如果你考虑/web将来重命名dir,你应该让它可配置.例如,AsseticBundle在其DI配置中有这样的选项(参见此处此处).


red*_*m13 44

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

service_name:
    class: Namespace\Bundle\etc
    arguments: ['%kernel.root_dir%']
Run Code Online (Sandbox Code Playgroud)

然后,您可以在类构造函数中获取Web根目录:

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


Mol*_*Man 17

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

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

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

    $container->get('request')->getBasePath();
    // in controller:
    $this->getRequest()->getBasePath();
    
    Run Code Online (Sandbox Code Playgroud)


Tho*_*aux 15

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

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

web_dir: "%kernel.root_dir%/../web"
Run Code Online (Sandbox Code Playgroud)

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

$this->getParameter('web_dir');
Run Code Online (Sandbox Code Playgroud)


小智 12

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

define('WEB_DIRECTORY', __DIR__);
Run Code Online (Sandbox Code Playgroud)

问题是在命令行代码中使用常量会中断.您还可以将常量添加到app/console文件和其他环境前端控制器

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


Tek*_*Tek 12

更新:从2.8开始,这不再有效,因为默认情况下不再包含资产.虽然如果你使用资产,这将有效.

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

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

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

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