コントローラーで資産の完全なURLを取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/8811251

  •  26-10-2019
  •  | 
  •  

質問

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

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

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

役に立ちましたか?

解決

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

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

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

見る Symfony\Component\Routing\Generator\UrlGenerator::doGenerate より強固な実装のため。

また、Twigはリクエストにアクセスできます app.request.

他のヒント

これをコントローラーで使用できます。

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

編集 : この方法には、 app.phpapp_dev.php URLに。意味 これは、url rewritingが有効になっている場合にのみ生産で機能します!

使用できます 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();
    }
}

Twigテンプレートの使用からこのURLを取得したい場合:

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

Symfonyのように 2.1 使用できます:

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

ノート: :このソリューションには、取り組むべき利点があります 両方 開発環境と製品環境。

最良の解決策は、私見です 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 それぞれサービスまたはクラス。

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

これにより、app_dev.phpの問題が回避されます

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

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

資産の完全なURLがオンになります $assetFullUrl

これは私のために働きます

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

方法 app.request.uriForPath() パスから絶対的なURLを与えます。ヘルパー asset() 資産のパスを与えます。

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

例:アプリケーションがドメインの根本にない場合の両方を持つことが重要です。

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

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

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

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.yml, config_dev.ymlconfig_test.yml したがって、プロジェクトを異なる環境間で移動するとき、すでにそこにあるので変更する必要はありません。

乾杯!

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']

関数を使用できます getschemeandhttphost() スキームとHTTPホストを取得し、関数を使用するには getBasepath() このリクエストが実行されるルートパスを取得するには

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

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

次のコードを使用して、サイトURL IEポイントをWebフォルダーに入手できます

$ protocol = spripos($ _ 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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top