【问题标题】:How to get the server path to the web directory in Symfony2 from inside the controller?如何从控制器内部获取 Symfony2 中 web 目录的服务器路径?
【发布时间】:2012-02-13 18:23:06
【问题描述】:

问题如下:

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

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

这在关于 Doctrine 文件处理的食谱文章中有所建议

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

四处寻找,只能在控制器内部使用(或注入内核的服务):

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

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

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

【问题讨论】:

  • 我遇到了同样的问题,不得不使用 getRootDir()。无法获得 /web 文件夹的完整路径真的很烦人! :P

标签: php symfony


【解决方案1】:

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

你可以在内核类的实例上使用getRootDir(),就像你写的一样。如果您考虑将来重命名/web dir,则应使其可配置。例如 AsseticBundle 在其 DI 配置中有这样一个选项(参见herehere)。

【讨论】:

  • 谢谢。如果没有弹出任何其他内容,我将使用 getRootDir 方法,这似乎是最合理和最通用的方法。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    您还可以从请求服务的任何 ContainerAware(f.i. Controller)类中获取它:

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

    【讨论】:

    • 感谢您的回答。但问题是 - 我不是该项目的唯一开发人员,我确信其中一些不使用虚拟主机,而有些则使用虚拟主机,包括我在内。所以解决方案应该比这更通用......这就是为什么(并考虑到第二个答案)我可能会使用 getRootDir() 方法作为更通用的方法。
    • 如果你想获取没有请求上下文的目录,这个是行不通的,不是吗?喜欢命令?
    【解决方案4】:

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

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

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

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

    $this->getParameter('web_dir');
    

    【讨论】:

      【解决方案5】:

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

      define('WEB_DIRECTORY', __DIR__);
      

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

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

      【讨论】:

        【解决方案6】:

        更新:从 2.8 开始,这不再有效,因为默认情况下不再包含资产。尽管如果您使用的是资产,这将起作用。

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

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

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

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:
            $host = $request->server->get('HTTP_HOST');
            $base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : '';
            $getBaseUrl = $host.$base;
            

            【讨论】:

            • 这不是用于获取请求 url,而不是用于文件系统路径吗?
            【解决方案9】:

            自 Symfony 3.3 以来,

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

            【讨论】:

              猜你喜欢
              • 2015-11-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多