[英]How to get the server path to the web directory in Symfony2 from inside the controller?
问题如下:
如何从控制器内部(或出于该原因从任何其他地方)获取Symfony2中的Web目录的服务器路径
我已经找到了(也在这里搜索):
有关Doctrine文件处理的食谱文章中建议这样做
$path = __DIR__ . '/../../../../web';
通过搜索找到,只能从控制器内部(或注入内核的服务)使用:
$path = $this->get('kernel')->getRootDir() . '/../web';
那么,绝对没有办法至少获得路径中“网络”的一部分吗? 例如,如果我决定重命名或移动或其他什么,该怎么办?
在第一个symfony中,一切都很简单,当我可以通过调用静态sfConfig :: get()方法从代码中的任何地方获得所需的一切。
要从控制器外部访问根目录,只需在服务配置中注入%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 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__);
问题是在命令行代码中使用常量会中断。 您还可以将常量添加到app / console文件和其他环境前端控制器
另一种解决方案可能是在AppKernel上添加一个返回DIR的静态方法。'/ .. / web /'所以你可以随处访问
更新:从2.8开始,这不再有效,因为默认情况下不再包含资产。 虽然如果你使用资产,这将有效。
您可以使用变量%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/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.