51

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

我怎样才能得到它的完整网址?

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

4

15 回答 15

57

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

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

您可以制作一个树枝扩展来切割/web路径的一部分并使用请求来生成基本 url。

查看Symfony\Component\Routing\Generator\UrlGenerator::doGenerate更可靠的实现。

此外,Twig 可以访问来自app.request.

于 2012-01-11T14:44:31.627 回答
43

您可以在控制器中使用它:

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

编辑:此方法还包括urlapp.php和。app_dev.php这意味着这只会在启用 url-rewriting 时在生产中工作

于 2012-09-27T15:13:42.133 回答
29

您可以使用该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();
    }
}
于 2013-05-11T15:38:39.137 回答
15

如果您想从 twig 模板中获取此 url,请使用:

{{ app.request.uriForPath('/uploads/myimage.jpg') }}
于 2012-06-14T15:16:38.260 回答
12

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

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

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

于 2015-11-24T13:38:19.917 回答
10

最好的解决方案是恕我直言,查看Twig的实现asset,您可以在以下位置找到:

\Symfony\Bundle\TwigBundle\Extension\AssetsExtension

在方法中:

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

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

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

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

于 2014-10-14T12:39:39.737 回答
4
app.request.uriForPath('/uploads/myimage.jpg') | replace({'/app_dev.php': ''})

这避免了 app_dev.php 的问题

于 2013-09-25T23:06:25.290 回答
3

此解决方案不需要在配置中添加任何变量或参数,并且与 Twig 使用的功能相同{{ absolute_url() }}

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

您的资产的完整网址将在$assetFullUrl

于 2018-01-17T10:16:49.537 回答
2

这个对我有用

$baseurl = $this->getRequest()->getScheme() . '://' . $this->getRequest()->getHttpHost() . $this->getRequest()->getBasePath();
于 2013-05-13T09:51:30.673 回答
2

方法app.request.uriForPath()从路径中给出一个绝对 URL。Helperasset()给出资产的路径。

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

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

http://mydomain.com/myapp/app.php
于 2013-10-28T17:32:40.353 回答
2

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

首先是 config.yml 中的资产基础 url:

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']
于 2019-02-01T14:59:13.680 回答
1

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

{% image '@AcmeBundle/Resources/public/images/myimage.jpg' %} 
    <img src="{{ app.request.uriForPath(asset_url) }}"> 
{% endimage %}
于 2015-03-13T09:07:19.367 回答
0

Symfony 3.3+ 中的工作解决方案

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

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

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

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

该解决方案的最佳之处在于能够为不同的环境预先定义它,例如:在 中config.ymlconfig_dev.yml因此config_test.yml当您在不同环境之间移动项目时,您不必更改它,因为它已经存在..

干杯!

于 2017-08-27T09:27:46.707 回答
0

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

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

此方法适用于 app.php 和 app_dev.php。

于 2019-07-27T07:37:07.397 回答
-1

您可以使用以下代码获取站点 url,即指向 web 文件夹

$protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === true ? '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;
于 2017-11-22T19:25:33.373 回答