如何在Controller中获取资源的完整url?

我需要在控制器中生成一些JSON内容,并且需要获取上传图片的完整URL: /web/uploads/myimage.jpg

我怎样才能得到完整的url?

http://www.mywebsite.com/uploads/myimage.jpg

您可以从请求对象中生成url:

 $baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath(); 

您可以创build一个树枝扩展,以切割path的/web部分,并使用请求生成基础url。

请参阅Symfony\Component\Routing\Generator\UrlGenerator::doGenerate以获得更加可靠的实现。

此外,Twig可以访问来自app.request的请求。

你可以在Controller中使用它:

 $this->getRequest()->getUriForPath('/uploads/myimage.jpg'); 

编辑:这个方法也包括app.phpapp_dev.php的url。 这意味着只有在启用了URL重写的情况下才能在生产环境中工作

您可以使用templating.helper.assets服务。

首先定义您的资产基地url :

 # app/config/config.yml framework: templating: assets_base_url: "http://www.mywebsite.com/" 

然后,只需从您的控制器,命令或任何位置调用该服务即可:

 <?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(); } } 

如果你想从树枝模板中得到这个URL,使用:

 {{ app.request.uriForPath('/uploads/myimage.jpg') }} 

最好的解决scheme将是恕我直言,看看Twigasset实施,你可以find:

 \Symfony\Bundle\TwigBundle\Extension\AssetsExtension 

在方法中:

 public function getAssetUrl($path, $packageName = null, $absolute = false, $version = null) 

它基本上使用了类似于@ iamdto的答案的templating.helper.assets服务:

 $url = $this->container->get('templating.helper.assets')->getUrl($path, $packageName, $version); 

或者分别直接使用AssetsExtension服务或类。

从Symfony 2.1开始,你可以使用:

 $request->getSchemeAndHttpHost(). '/uploads/myimage.jpg'; 

注意 :此解决scheme可以在DEV和PROD环境中工作。

 app.request.uriForPath('/uploads/myimage.jpg') | replace({'/app_dev.php': ''}) 

这避免了app_dev.php的问题

这个为我工作

 $baseurl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getBasePath(); 

方法app.request.uriForPath()从path中提供绝对URL。 助手asset()给出asset()的path。

 {{ app.request.uriForPath(asset('bundles/mybundlehttp://img.dovov.comname.png')) }} 

在应用程序不在域的根目录下的情况下,对于例如:

 http://mydomain.com/myapp/app.php 

@Al Jey解决scheme在Assetic上运行良好(在Symfony 2.6上testing过)

 {% image '@AcmeBundle/Resources/publichttp://img.dovov.commyimage.jpg' %} <img src="{{ app.request.uriForPath(asset_url) }}"> {% endimage %} 

Symfony 3.3+的工作解决scheme

 # app/config/config.yml parameters: ... base_url: 'http://mywebsite.com' 

为了让你的控制器行动:

 $baseUrl = $this->getParameter('base_url'); 

你现在可以追加你的图像,例如: $baseUrl . '/uploads/' . $image $baseUrl . '/uploads/' . $image $baseUrl . '/uploads/' . $image或者如果你喜欢,你可以在config.yml中定义上传的资产基础URL,并在控制器动作中访问它。

关于这个解决scheme的最好的事情是能够为不同的环境预先定义它,例如:在config.ymlconfig_test.ymlconfig_test.yml所以当你在不同的环境之间移动你的项目时,你不需要改变它它已经在那里..

干杯!

您可以通过使用下面的代码获取网站的URL,即指向Web文件夹

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