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

时间:2012-02-13 18:23:07

标签: php symfony

问题如下:

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

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

这是关于Doctrine文件处理的食谱文章中的建议

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

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

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

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

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

9 个答案:

答案 0 :(得分:47)

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

您可以在编写时使用getRootDir()内核类的实例。如果您考虑将来重命名/web目录,则应将其设置为可配置。例如,AsseticBundle在其DI配置中有这样的选项(参见herehere)。

答案 1 :(得分:44)

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

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

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

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

答案 2 :(得分:17)

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

  • 如果你使用apache作为网络服务器(我想其他的 webservers解决方案将是类似的)并正在使用 虚拟主机(您的网址看起来像这样 - 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();
    

答案 3 :(得分:15)

你在Symfony,想“依赖注入”^^

在我所有的SF项目中,我都在参数.yml:

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

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

$this->getParameter('web_dir');

答案 4 :(得分:12)

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

define('WEB_DIRECTORY', __DIR__);

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

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

答案 5 :(得分:12)

更新:自2.8起,这不再有效,因为默认情况下不再包含资产。虽然如果您使用资产,这将有效。

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

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

由于您的资产依赖于此变量转储到您的网络目录,因此可以安全地假设并使用它来查找您的网络文件夹。

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

答案 6 :(得分:2)

对于Symfony3 在您的控制器中尝试

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

从Symfony 3.3开始,

您可以使用%kernel.project_dir%/web/代替%kernel.root_dir%/../web/