如何在Controller中获取资产的完整URL?

i.a*_*iel 47 symfony assetic

我需要在控制器中生成一些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.

  • 不推荐使用`getRequest()`来支持`Request`object的注入 (7认同)
  • `$ request = $ this-> getRequest();` (5认同)

小智 39

您可以在Controller中使用它:

$this->getRequest()->getUriForPath('/uploads/myimage.jpg');
Run Code Online (Sandbox Code Playgroud)

编辑:此方法还包括app.phpapp_dev.phpURL.含义启用URL重写时,这只会在生产工作!

  • 看起来,这只适用于生产环境. (8认同)
  • @RayOnAir,问题是如果你使用`app_dev.php`网址,资源将被附加到这个网址,例如`http:// bla.com/app_dev.php/uploads/test.png` - 哪个不存在. (3认同)
  • 对我而言,此解决方案也适用于开发环境. (2认同)
  • 在Symfony 2.5中不起作用.此代码返回包含在路径中的app.php或app_dev.php的URL.顺便说一句,它可以使用,但你必须使用str_replace()来生成合法的URL. (2认同)

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)

  • 或{{asset('/ uploads/myimage.jpg')}}.并不是说问题与视图有关,只是说在twig中有一种更简单的方法=) (8认同)
  • @MattiasSvensson"asset"给了我完整的路径,但不是uri(不是绝对的) (5认同)

COi*_*Oil 10

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

$request->getSchemeAndHttpHost(). '/uploads/myimage.jpg';
Run Code Online (Sandbox Code Playgroud)

注意:此方法的优点在工作 DEV和PROD环境.


str*_*yba 8

最好的解决方案是恕我直言,看看你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服务或类.