如何在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.php
和app_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将是恕我直言,看看Twig
的asset
实施,你可以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.yml
, config_test.yml
和config_test.yml
所以当你在不同的环境之间移动你的项目时,你不需要改变它它已经在那里..
干杯!
您可以通过使用下面的代码获取网站的URL,即指向Web文件夹
$host = $request->server->get('HTTP_HOST'); $base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : ''; $getBaseUrl = $host.$base;