如何从控制器中获取Symfony2中的Web目录的服务器path?
问题如下:
我怎么能从控制器(或从其他地方)的服务器path到Symfony2中的Web目录?
我已经find了(也在这里search):
在关于Doctrine文件处理的食谱文章中build议这样做
$path = __DIR__ . '/../../../../web';
通过searchfind,只能在控制器内部使用(或注入内核的服务):
$path = $this->get('kernel')->getRootDir() . '/../web';
那么,是否绝对没有办法获得至less那个“networking”部分的path? 比如说,如果我决定重命名或移动什么的话呢?
在第一个symfony中,一切都很简单,通过调用静态的sfConfig :: get()方法,我可以从代码的任何地方得到我需要的所有东西。
在Symfony2中实际上没有直接的方法来获取webdir,因为框架完全独立于webdir。
就像你写的一样,你可以在内核类的实例上使用getRootDir()
。 如果您将来考虑重命名/web
目录,则应该使其可configuration。 例如,AsseticBundle在其DIconfiguration中有这样一个选项(参见这里和这里 )。
要从控制器外部访问根目录,只需在服务configuration中注入%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控制器)类获取它:
-
如果你使用Apache作为一个networking服务器(我想其他的networking服务器的解决scheme将是类似的),并使用virtualhosting(你的url看起来像这样 –
localhost/app.php
那么你可以使用:$container->get('request')->server->get('DOCUMENT_ROOT'); // in controller: $this->getRequest()->server->get('DOCUMENT_ROOT');
-
否则(你的url看起来像这样 –
localhost/path/to/Symfony/web/app.php
:$container->get('request')->getBasePath(); // in controller: $this->getRequest()->getBasePath();
更新:由于2.8这不再起作用,因为资产不再是默认包含的。 虽然如果你使用资产,这将工作。
您可以使用variables%assetic.write_to%.
$this->getParameter('assetic.write_to');
由于您的资产依赖于这个variables被转储到您的Web目录,所以假设并使用它来定位您的Web文件夹是安全的。
http://symfony.com/doc/current/reference/configuration/assetic.html
我的解决scheme是将此代码添加到app.php
define('WEB_DIRECTORY', __DIR__);
问题是,在使用常量的命令行代码将会中断。 您也可以将常量添加到应用程序/控制台文件和其他环境前端控制器
另一个解决scheme可能是在AppKernel添加一个静态方法,返回DIR 。'/ .. / web /'所以你可以随处访问
你在Symfony上,想“dependency injection”^^
在我所有的SF项目中,我都是在parameters.yml中做的:
web_dir: "%kernel.root_dir%/../web"
所以我可以安全地在控制器内使用这个参数:
$this->getParameter('web_dir');
对于Symfony3在你的控制器尝试
$request->server->get('DOCUMENT_ROOT').$request->getBasePath()