51

コントローラでJSONコンテンツを生成する必要があり、ここにあるアップロードされた画像への完全なURLを取得する必要があります:/web/uploads/myimage.jpg

どうすれば完全なURLを取得できますか?

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');

編集:このメソッドには、URLへのとも含まapp.phpれます。app_dev.phpつまり、これはURL書き換えが有効になっている場合にのみ本番環境で機能します。

于 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

小枝テンプレート内からこの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

最善の解決策は、IMHOが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

このソリューションは、configに変数やパラメーターを追加する必要がなく、Twigが使用するのと同じ関数です。{{ absolute_url() }}

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

アセットの完全なURLが表示されます$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を提供します。ヘルパーasset()はアセットのパスを提供します。

{{ 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

Symfony3.3以降の実用的なソリューション

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

コントローラアクションでそれを取得するには:

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

これで、画像を追加できます。例:$baseUrl . '/uploads/' . $imageまたは、必要に応じて、アップロードされたアセットのベースURLをconfig.ymlで定義し、コントローラーアクションでアクセスできます。

このソリューションの最も優れている点は、さまざまな環境用に事前定義できることです。たとえば、でconfig.yml、 プロジェクトconfig_dev.ymlconfig_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 に答える