Symfony2 Twigテンプレートで設定パラメーターを取得する方法


170

Symfony2 Twigテンプレートがあります。このtwigテンプレートのconfigパラメータの値(バージョン番号)を出力したい。したがって、私はこのように構成パラメーターを定義しました:

parameters:
    app.version: 0.1.0

Controllersでこの構成パラメーターを使用できますが、Twigテンプレートでそれを取得する方法がわかりません。

回答:


406

configのtwig globalsセクションでパラメーター置換を使用できます。

パラメータ設定:

parameters:
    app.version: 0.1.0

小枝の設定:

twig:
    globals:
        version: '%app.version%'

小枝テンプレート:

{{ version }}

このメソッドには、ContainerAwareクラスでパラメーターを使用できるという利点があります。

$container->getParameter('app.version');

いい答えだ。補遺:Symfony 3.1以降、変数は引用符で囲む必要があります: "%app.version%"
BigJ

@BigJ:古いバージョンでも機能するため、引用符を含むように更新されました。
Ryall

2
これは間違いなく受け入れられる答えになるはずです。よろしくお願いします!
2016年

191

簡単に、設定ファイルで定義できます:

twig:
    globals:
        version: "0.1.0"

そしてあなたのテンプレートでそれにアクセスする

{{ version }}

それ以外の場合は、パラメーターを公開するTwig拡張機能を使用する方法である必要があります。


28
@Ryallが説明したようなパラメータで設定する方が良いです。
MrGlass、

89

組み込みのサービスパラメータシステムを利用して、値を分離または再利用することもできます。

# app/config/parameters.yml
parameters:
    ga_tracking: UA-xxxxx-x

# app/config/config.yml
twig:
    globals:
        ga_tracking: "%ga_tracking%"

これで、変数ga_trackingがすべてのTwigテンプレートで使用可能になります。

<p>The google tracking code is: {{ ga_tracking }}</p>

パラメータはコントローラ内でも使用できます。

$this->container->getParameter('ga_tracking');

サービスをグローバルTwig変数(Symfony2.2 +)として定義することもできます:

# app/config/config.yml
twig:
    # ...
    globals:
        user_management: "@acme_user.user_management"

http://symfony.com/doc/current/templating/global_variables.html

設定したいグローバル変数がもっと複​​雑な場合-たとえばオブジェクト-は、上記の方法を使用できなくなります。代わりに、Twigエクステンション作成し、getGlobalsメソッドのエントリの1つとしてグローバル変数を返す必要があります。


5
これは、システムのすべての知識を一緒に保つため、最良のソリューションのように見えます。
ジャニスGruzis

19

Symfony2の新しいバージョン(parameters.yml代わりにparameters.ini)では、キーと値のペアの代わりにオブジェクトまたは配列を保存できるため、次のようにグローバルを管理できます。

config.yml(一度だけ編集):

# app/config/config.yml
twig:
  globals:
    project: %project%

parameters.yml:

# app/config/parameters.yml
project:
  name:       myproject.com
  version:    1.1.42

そして、twigファイルでは、{{ project.version }}またはを使用できます{{ project.name }}

注:個人的にに何かを追加することは嫌いappです。それはSymfonyの変数であり、将来何がそこに格納されるのかわからないからです。


16

上記のansは正しく、正常に機能します。別の方法で使用しました。

config.yml

imports:
    - { resource: parameters.yml }
    - { resource: security.yml }
    - { resource: app.yml }
    - { resource: app_twig.yml }

app.yml

parameters:
  app.version:           1.0.1

app_twig.yml

twig:
  globals:
    version: %app.version%

内部コントローラー:

$application_version = $this->container->getParameter('app.version');
// Here using app.yml

テンプレート/小枝ファイル内:

Project version {{ version }}!
{#  Here using app_twig.yml content.  #}
{#  Because in controller we used $application_version  #}

コントローラ出力を使用するには:

コントローラ:

public function indexAction() {
        $application_version = $this->container->getParameter('app.version');
        return array('app_version' => $application_version);
    }

テンプレート/小枝ファイル:

Project version {{ app_version }}

私は理解を深めるために別のことを述べました。


1
ええ、いいですね。この回答は、コントローラを介して渡すことと、グローバルtwig変数として渡すことの両方の方法を非常によく説明しています。+1
Gottlieb Notschnabel 2013年

12

Twig拡張parameter機能を使用すると、Twig関数を作成できます。

{{ parameter('jira_host') }}

TwigExtension.php:

class TwigExtension extends \Twig_Extension
{
    public $container;

    public function getFunctions()
    {
        return [
            new \Twig_SimpleFunction('parameter', function($name)
            {
                return $this->container->getParameter($name);
            })
        ];
    }


    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName()
    {
        return 'iz';
    }
}

service.yml:

  iz.twig.extension:
    class: IzBundle\Services\TwigExtension
    properties:
      container: "@service_container"
    tags:
      - { name: twig.extension }

このおかげで、パラメーターファイルからtwigグローバルにパラメーターを複製する必要があると心配しました。
Joe Yahchouchi

いいですが、1つのパラメーターの拡張にコンテナー全体をプルする必要のないオーバーロードではありませんか?
Lajdákマレク

Symfony 2では、コンテナーパラメーターを注入できないと思います(Symfony 4/5で可能になりました)
Thomas Decaux


-3

confing.yml内

# app/config/config.yml
twig:
  globals:
    version: '%app.version%'

小枝ビュー

# twig view
{{ version }}

2
サービスコンテナ全体へのアクセスを許可することはお勧めできません。コンテナーはサービスロケーターであり、依存関係の注入でさえ注入されるべきではないので、小枝でも
Paul Andrieux
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.