Symfony 2でウェブサイトのベースURLを取得し、それをグローバルにtwigに渡します


89

CodeIgniterからSymfony 2に切り替えます。次の方法の例を誰かに教えてもらえますか?

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

回答:


92

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

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

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

実際、ウェブサイトのベースURLを取得しても、ホームページルートの完全なURLが取得されるだけです。

{{ url('homepage') }}

ホームページ、またはルーティングファイルで呼び出す名前)。


どうもありがとう、私はこれが進むべき道だと思っていましたが、{{path(..)}}関数についてしか知らなかったため、間違った結果が生じていました。{{url}}は私が必要としていたものです。
Geoffrey De Vylder

symfonyコンソールコマンドから小枝をレンダリングしている場合、電子メールテンプレートを生成するには、ベースURLが必要です。その場合はどうすればよいですか。
vishal 2013

1
そのためのクックブックがあります:symfony.com/doc/master/cookbook/console/sending_emails.html
Damien

twigを使用していない場合、これをPHPでどのように書き直すことができますか?
Nis

1
機能しない致命的なエラー:キャッチされないTwig_Error_Syntax:J:\ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \の5行目の "default / template / extension / module / featured.twig"にある不明な "url"関数ExpressionParser.php:574スタックトレース:#0
Kamlesh

143

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

{{ app.request.getBaseURL() }}

それ以降のSymfonyバージョン(2.5でテスト済み)では、以下を試してください。

{{ app.request.getSchemeAndHttpHost() }}

36
これを短縮することもでき{{ app.request.baseUrl }}ます(getterメソッドを見つけて自動的に呼び出します)
Colin O'Dell

2
@Colin O'Dellはさらに、ビューでメソッド呼び出しを使用しない方がより適切です。ビューはオブジェクトにどのメソッドがあるかを知らないはずです。symfonyでは少し違って見えますが、とにかくその答えは+10です。
thorinkor 2013年

1
twigを使用していない場合、これをPHPでどのように書き直すことができますか?
Nis

6
これはそれ以降のバージョンでは機能しません(sf 2.5でテスト済み)。以下の答えは{{ app.request.getSchemeAndHttpHost() }}うまくいきます!
RayOnAir 2015年

55

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

{{ app.request.getSchemeAndHttpHost() }}

1
この関数はsymfony 2.1
COil

35

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

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


34

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

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

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

17

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

$this->get('request')->getSchemeAndHttpHost();

$this->container->get('request')->getSchemeAndHttpHost()
Alex Quintero

16
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

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

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

3

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

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

2
回答にもう少し説明を追加してください-アセットは結局baseUrlを使用しますか?私のプロジェクトでは、相対URLを表示するだけです
Nico Haase

2

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

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

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

2

現在の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のドキュメントも参照してください。



0

マルチドメインアプリケーションが関係する1つの状況で、app.request.getHttpHost私を助けました。example.comまたはsubdomain.example.com(またはexample.com:8000ポートが標準でない場合)のようなものを返します。これはsymfony 3.4にありました。


-1

ここですべてのオプションを試しましたが、うまくいきませんでした。最終的に私はそれを使ってそれを動作させました

{{ サイトのURL }}

これがまだ苦労している人を助けることを願っています。


これはどこから来たのですか?何がsite含まれていますか?
Nico Haase

それはティンバーとワードプレスからです。
コンスタンティノス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.