コントローラーで資産の完全なURLを取得するにはどうすればよいですか?
質問
コントローラーで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.php
と app_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.yml
と config_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;