web-dev-qa-db-ja.com

Controllerでアセットの完全なURLを取得する方法は?

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

完全なURLを取得するにはどうすればよいですか?

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

47
i.am.michiel

リクエストオブジェクトからURLを生成できます。

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

パスの/web部分をカットし、リクエストを使用してベースURLを生成するtwig拡張機能を作成できます。

より確実な実装については、Symfony\Component\Routing\Generator\UrlGenerator::doGenerateを参照してください。

また、Twig=はapp.requestからのリクエストにアクセスできます。

52
solarc

Controllerでこれを使用できます。

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

EDIT:このメソッドには、app.phpおよびapp_dev.phpをURLに。意味これは、URL書き換えが有効になっている場合にのみ本番環境で動作します

38
smatyas

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();
    }
}
28
iamdto

twigテンプレートを使用してこのURLを取得する場合:

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

Symfony 2.1現在、以下を使用できます:

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

:このソリューションには、両方 DEVおよびPROD環境で動作するという利点があります。

10
COil

最良の解決策は、Twigassetの実装を確認する私見です。

\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サービスまたはクラスをそれぞれ直接使用します。

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

これはapp_dev.phpの問題を回避します

4
Ignacio

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

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

アセットの完全なURLは$assetFullUrl

3
Rui Cardoso

これは私のために働く

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

メソッドapp.request.uriForPath()は、パスからの絶対URLを提供します。ヘルパーasset()は、アセットのパスを提供します。

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

たとえば、アプリケーションがドメインのルートにない場合には、両方を持つことが重要です。

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

@Al JeyソリューションはAsseticで正常に動作します(Symfony 2.6でテスト済み)

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

関数getSchemeAndHttpHost()を使用してスキームとHTTPホストを取得し、関数getBasePath()を使用してこのリクエストの実行元のルートパスを取得できます。

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

このメソッドは、app.phpおよびapp_dev.phpに対して正常に機能します。

0
pedram shabani

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']
0
Yes Barry

Symfony 3.3+の実用的なソリューション

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

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

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

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

このソリューションの最大の利点は、さまざまな環境に合わせて事前に定義できることです。例:config.ymlconfig_dev.ymlおよびconfig_test.ymlしたがって、異なる環境間でプロジェクトを移動する場合、既に存在しているので変更する必要はありません。

乾杯!

0
Muzafar Ali