我需要在控制器中生成一些JSON内容,我需要获取位于此处的上传图像的完整URL : /web/uploads/myimage.jpg.
我怎样才能得到它的完整网址?
http://www.mywebsite.com/uploads/myimage.jpg
sol*_*arc 53
您可以从请求对象生成URL:
$baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
Run Code Online (Sandbox Code Playgroud)
您可以制作一个枝条扩展,切割/web路径的一部分,并使用请求生成基本URL.
看看Symfony\Component\Routing\Generator\UrlGenerator::doGenerate更稳固的实施.
此外,Twig可以访问来自的请求app.request.
小智 39
您可以在Controller中使用它:
$this->getRequest()->getUriForPath('/uploads/myimage.jpg');
Run Code Online (Sandbox Code Playgroud)
编辑:此方法还包括app.php和app_dev.phpURL.含义启用URL重写时,这只会在生产工作!
iam*_*dto 28
您可以使用该templating.helper.assets服务.
首先定义您的资产基础URL:
# app/config/config.yml
framework:
templating:
assets_base_url: "http://www.mywebsite.com/"
Run Code Online (Sandbox Code Playgroud)
然后只需从控制器,命令或任何地方调用服务:
<?php
// src/Acme/Bundle/DemoBundle/Controller/DemoController.php
namespace Acme\Bundle\DemoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DemoController extends Controller
{
public function indexAction()
{
$myAssetUrl = $this
->get('templating.helper.assets')
->getUrl('bundles/acmedemo/js/main.js', $packageName = null)
;
// $myAssetUrl is "http://www.mywebsite.com/bundles/acmedemo/js/main.js"
return array();
}
}
Run Code Online (Sandbox Code Playgroud)
Eug*_*nko 15
如果您想从树枝模板中获取此URL,请使用:
{{ app.request.uriForPath('/uploads/myimage.jpg') }}
Run Code Online (Sandbox Code Playgroud)
COi*_*Oil 10
从Symfony 2.1开始,您可以使用:
$request->getSchemeAndHttpHost(). '/uploads/myimage.jpg';
Run Code Online (Sandbox Code Playgroud)
注意:此方法的优点在工作既 DEV和PROD环境.
最好的解决方案是恕我直言,看看你Twig的实现asset,你可以找到:
\Symfony\Bundle\TwigBundle\Extension\AssetsExtension
Run Code Online (Sandbox Code Playgroud)
在方法中:
public function getAssetUrl($path, $packageName = null, $absolute = false, $version = null)
Run Code Online (Sandbox Code Playgroud)
它基本上使用templating.helper.assets类似于@ iamdto的答案的服务:
$url = $this->container->get('templating.helper.assets')->getUrl($path, $packageName, $version);
Run Code Online (Sandbox Code Playgroud)
或者分别直接使用AssetsExtension服务或类.