CodeIgniterからSymfony 2に切り替えています。誰かが私に方法の例を教えてください。
なぜこのルートURLを取得する必要があるのですか?絶対URLを直接生成できませんか?
{{ url('_demo_hello', { 'name': 'Thomas' }) }}
このTwigコードは、_demo_helloルートへの完全なhttp:// URLを生成します。
実際、ウェブサイトのベースURLを取得することは、ホームページルートの完全なURLのみを取得することです:
{{ url('homepage') }}
(homepage、またはルーティングファイルで呼び出すもの)。
これはtwigテンプレートで無料で利用可能になりました(sf2バージョン2.0.14でテスト済み)
{{ app.request.getBaseURL() }}
後のバージョンのSymfony(2.5でテスト済み)で試してください:
{{ app.request.getSchemeAndHttpHost() }}
新しいリクエストメソッドgetSchemeAndHttpHost()
を使用できます:
{{ app.request.getSchemeAndHttpHost() }}
ベースURLはSymfony\Component\Routing\RequestContext
内で定義されます。
次のようにコントローラーから取得できます。
$this->container->get('router')->getContext()->getBaseUrl()
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に含まれている場合に含まれます。
Symfony 2.3+の場合、コントローラーのベースURLを取得するには
$this->get('request')->getSchemeAndHttpHost();
<base href="{{ app.request.getSchemeAndHttpHost() }}"/>
またはコントローラーから
$this->container->get('router')->getContext()->getSchemeAndHttpHost()
また、js/css/imageのURLには、便利な関数asset()があります
<img src="{{ asset('image/logo.png') }}"/>
変数をテンプレートにグローバルに渡す代わりに、ベーステンプレートを定義し、その中に「グローバルパーツ」をレンダリングできます。基本テンプレートを継承できます。
テンプレートのレンダリングの例symfonyドキュメントから:
<div id="sidebar">
{% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>
現在の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の公式ドキュメントも参照してください。
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
マルチドメインアプリケーションを含む1つの状況では、app.request.getHttpHost
が役に立ちました。 example.com
やsubdomain.example.com
(ポートが標準ではない場合はexample.com:8000
)のようなものを返します。これはSymfony 3.4にありました。