コントローラで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');
編集:このメソッドには、URLへのとも含まapp.php
れます。app_dev.php
つまり、これはURL書き換えが有効になっている場合にのみ本番環境で機能します。
サービスをご利用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();
}
}
小枝テンプレート内からこのURLを取得する場合は、次を使用します。
{{ app.request.uriForPath('/uploads/myimage.jpg') }}
Symfony 2.1以降、以下を使用できます。
$request->getSchemeAndHttpHost().'/uploads/myimage.jpg';
注:このソリューションには、 DEV環境とPROD環境の両方で機能するという利点があります。
最善の解決策は、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
または、サービスまたはクラスをそれぞれ直接使用します。
app.request.uriForPath('/uploads/myimage.jpg') | replace({'/app_dev.php': ''})
これにより、app_dev.phpの問題が回避されます
このソリューションは、configに変数やパラメーターを追加する必要がなく、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
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']
@Al JeyソリューションはAsseticで正常に動作します(Symfony 2.6でテスト済み)
{% image '@AcmeBundle/Resources/public/images/myimage.jpg' %}
<img src="{{ app.request.uriForPath(asset_url) }}">
{% endimage %}
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.yml
をconfig_test.yml
さまざまな環境間で移動するときに、プロジェクトがすでに存在するため、プロジェクトを変更する必要はありません。
乾杯!
関数getSchemeAndHttpHost()を使用して、スキームとHTTPホストを取得し、関数getBasePath()を使用して、この要求が実行されるルートパスを取得できます。
$request->getSchemeAndHttpHost().$request->getBasePath()."/uploads/myimage.jpg"
このメソッドは、app.phpおよびapp_dev.phpで正常に機能します。
次のコードを使用して、サイトの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;