web-dev-qa-db-ja.com

WebサイトのベースURLを取得し、Symfony 2のtwigにグローバルに渡します

CodeIgniterからSymfony 2に切り替えています。誰かが私に方法の例を教えてください。

  • ベースURL(ルート固有の部分のないURL)を取得します
  • この変数をtwigバンドルにグローバルに渡して、すべてのテンプレートで使用できるようにします。
81
geoffreydv

なぜこのルートURLを取得する必要があるのですか?絶対URLを直接生成できませんか?

{{ url('_demo_hello', { 'name': 'Thomas' }) }}

このTwigコードは、_demo_helloルートへの完全なhttp:// URLを生成します。

実際、ウェブサイトのベースURLを取得することは、ホームページルートの完全なURLのみを取得することです:

{{ url('homepage') }}

homepage、またはルーティングファイルで呼び出すもの)。

84
Damien

これはtwigテンプレートで無料で利用可能になりました(sf2バージョン2.0.14でテスト済み)

{{ app.request.getBaseURL() }}

後のバージョンのSymfony(2.5でテスト済み)で試してください:

{{ app.request.getSchemeAndHttpHost() }}
132
codecowboy

新しいリクエストメソッドgetSchemeAndHttpHost()を使用できます:

{{ app.request.getSchemeAndHttpHost() }}
49
Hugo Nogueira

ベースURLはSymfony\Component\Routing\RequestContext内で定義されます。

次のようにコントローラーから取得できます。

$this->container->get('router')->getContext()->getBaseUrl()
32
sumanchalki

Symfony v2.1からv4.1 +まで有効

SymfonyアプリケーションのベースURLが必要な場合は、getSchemeAndHttpHost()の動作と同様に、getBaseUrl()と連結したgetUri()を使用する必要がありますが、ルーターパスとクエリ文字列は使用しません。

{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}

たとえば、Symfony WebサイトのURLがhttps://www.stackoverflow.com/app1/にある場合、これらの2つのメソッドはこれらの値を返します。

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

注:getBaseUrl()には、スクリプトファイル名(つまり、/app.php)がURLに含まれている場合に含まれます。

27
Matt Janssen

Symfony 2.3+の場合、コントローラーのベースURLを取得するには

$this->get('request')->getSchemeAndHttpHost();
16
Mr. 14
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

またはコントローラーから

$this->container->get('router')->getContext()->getSchemeAndHttpHost()
13
user3869574

また、js/css/imageのURLには、便利な関数asset()があります

<img src="{{ asset('image/logo.png') }}"/>
3
Sash

変数をテンプレートにグローバルに渡す代わりに、ベーステンプレートを定義し、その中に「グローバルパーツ」をレンダリングできます。基本テンプレートを継承できます。

テンプレートのレンダリングの例symfonyドキュメントから:

<div id="sidebar">
  {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>
2
Sethunath

現在のSymfonyバージョン(この回答を書いている時点ではSymfony 4.1です)では、他のいくつかの回答で行われているように、サービスコンテナーに直接アクセスしないでください。

代わりに(標準のサービス構成を使用しない限り)、タイプヒントによってリクエストオブジェクトを注入します。

<?php

namespace App\Service;

use Symfony\Component\HttpFoundation\RequestStack;

/**
 * The YourService class provides a method for retrieving the base URL.
 *
 * @package App\Service
 */
class YourService
{

    /**
     * @var string
     */
    protected $baseUrl;

    /**
     * YourService constructor.
     *
     * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
     */
    public function __construct(RequestStack $requestStack)
    {
        $this->baseUrl = $requestStack->getCurrentRequest()->getSchemeAndHttpHost();
    }

    /**
     * Returns the current base URL.
     *
     * @return string
     */
    public function getBaseUrl(): string
    {
        return $this->baseUrl;
    }
}

現在のリクエストオブジェクトを取得する方法 に関するSymfonyの公式ドキュメントも参照してください。

1
Arvid
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
0

マルチドメインアプリケーションを含む1つの状況では、app.request.getHttpHostが役に立ちました。 example.comsubdomain.example.com(ポートが標準ではない場合はexample.com:8000)のようなものを返します。これはSymfony 3.4にありました。

0
ACJ