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

时间:2012-01-10 22:10:07

标签: symfony assetic

我需要在控制器中生成一些JSON内容,我需要获取位于此处的上传图片的完整网址:/web/uploads/myimage.jpg

我如何获得它的完整网址?

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

15 个答案:

答案 0 :(得分:50)

您可以从请求对象生成网址:

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

您可以制作一个树枝扩展名,用于剪切路径的/web部分,并使用该请求生成基本网址。

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

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

答案 1 :(得分:38)

您可以在Controller中使用它:

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

编辑:此方法还包含网址的app.phpapp_dev.php。含义只有在启用网址重写时才能在生产中使用

答案 2 :(得分:28)

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

首先定义您的assets base 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();
    }
}

答案 3 :(得分:15)

如果您想从树枝模板中获取此网址,请使用:

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

答案 4 :(得分:9)

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

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

注意:此解决方案具有在 DEV和PROD环境中工作的优势。

答案 5 :(得分:8)

最佳解决方案是恕我直言,以查看Twig asset的实施情况,您可以在以下网址找到:

\Symfony\Bundle\TwigBundle\Extension\AssetsExtension
方法中的

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

基本上使用{@ 1}}服务,类似于@ iamdto的答案:

templating.helper.assets

或者分别直接使用$url = $this->container->get('templating.helper.assets')->getUrl($path, $packageName, $version); 服务或类。

答案 6 :(得分:4)

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

这可以避免app_dev.php的问题

答案 7 :(得分:3)

方法app.request.uriForPath()提供路径的绝对URL。帮助者asset()给出了资产的路径。

{{ app.request.uriForPath(asset('bundles/mybundle/images/name.png')) }}

对于应用程序不在域的根目录的情况,两者都很重要,例如:

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

答案 8 :(得分:3)

此解决方案不需要在config上添加任何变量或参数,并且与Twig用于{{ absolute_url() }}

的功能相同
public function yourAction(AssetsHelper $assetsHelper, HttpFoundationExtension $httpExtension)
{
    $assetsPath = $assetsHelper->getUrl('/img/test.jpg');
    $assetFullUrl = $httpExtension->generateAbsoluteUrl($assetPath);
}

您资产的完整网址将位于$assetFullUrl

答案 9 :(得分:2)

这个适用于我

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

答案 10 :(得分:1)

@Al Jey解决方案适用于Assetic(在Symfony 2.6上测试)

{% image '@AcmeBundle/Resources/public/images/myimage.jpg' %} 
    <img src="{{ app.request.uriForPath(asset_url) }}"> 
{% endimage %}

答案 11 :(得分:0)

Symfony 3.3 +中的工作解决方案

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

要在控制器操作中获取它:

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

您现在可以将图像附加到e-g:$baseUrl . '/uploads/' . $image,或者如果您愿意,可以在config.yml中定义上传的资源基本URL并在控制器操作中访问它。

此解决方案的最佳之处在于能够针对不同的环境预先定义它,例如:config.ymlconfig_dev.ymlconfig_test.yml,因此当您在不同的环境之间移动项目时,你不必改变它,因为它已经在那里..

干杯!

答案 12 :(得分:0)

对于CDN,您还可以将Packages直接注入服务中。

首先在config.yml中输入资产基础网址:

framework:
    assets:
        base_url:
            - 'http://cdn.mysite.com'

然后是有趣的部分:

namespace App\Service;

use Symfony\Component\Asset\Packages;

class SomeClass
{
    private $packages;

    public function __construct(Packages $packages)
    {
        $this->packages = $packages;
    }

    public function proxyToAssetUrl(string $path): string
    {
        return $this->packages->getUrl($path);
    }
}

如果启用了自动装配,则无需在services.yml中进行任何配置,否则将如下:

services:
    App\Service\SomeClass:
        class: App\Service\SomeClass
        arguments: ['@assets.packages']

答案 13 :(得分:0)

您可以使用函数 getSchemeAndHttpHost()获取方案和HTTP主机,并使用函数 getBasePath()获取执行此请求的根路径。

$request->getSchemeAndHttpHost().$request->getBasePath()."/uploads/myimage.jpg"

此方法对于app.php和app_dev.php很好。

答案 14 :(得分:-1)

您可以使用以下代码获取网站网址,即指向网络文件夹

$ protocol = stripos($ _ SERVER ['SERVER_PROTOCOL'],'https')===是吗? 'https://':'http://';

    $hostName = $request->server->get('HTTP_HOST');

    $baseDirectory = "";

    if(!empty($this->container->get('router')->getContext()->getBaseUrl())){

        $baseDirectory = str_replace('app_dev.php', '', $this->container->get('router')->getContext()->getBaseUrl());
    }

    $rootUrl = $protocol.$hostName.$baseDirectory;