Twigでクラス定数にアクセスする方法は?


133

エンティティクラスにいくつかのクラス定数があります。例:

class Entity {
    const TYPE_PERSON = 0;
    const TYPE_COMPANY = 1;
}

通常のPHPでは、私はよくやるif($var == Entity::TYPE_PERSON)ので、Twigでこの種のことをしたいと思います。出来ますか?

回答:


185
{% if var == constant('Namespace\\Entity::TYPE_PERSON') %}
{# or #}
{% if var is constant('Namespace\\Entity::TYPE_PERSON') %}

constant関数constantテストのドキュメントを参照してください。


3
オブジェクトインスタンスを含むテスト用定数をanwserに追加する必要があります{% if var is constant('TYPE_PERSON', object) %}
ioleo

1
@messageのメッセージのように名前空間を入力したときに機能しました。
クラフター、2015

232

時間を節約するだけです。名前空間でクラス定数にアクセスする必要がある場合は、

{{ constant('Acme\\DemoBundle\\Entity\\Demo::MY_CONSTANT') }}

22
ダブルスラッシュが重要であることに注意することが重要です。私は二重のバックスラッシュを入れていなかったので、私は数分を無駄にした。
ダンMorphisを

ありがとうございました!あなたは私の時間を節約します!:)
sintetico82 2014年

7
うわー、それは醜いです:-) Twigが定数を他のプロパティ/変数のように見せることができれば素晴らしいでしょう。例{% if var == object.MY_CONSTANT %}
Rik Heywood 2014年

27

1.12.1以降、オブジェクトインスタンスから定数を読み取ることもできます。

{% if var == constant('TYPE_PERSON', entity)

これは、エンティティがエンティティのインスタンスである場合にのみ機能します。質問は、テンプレートで定義されたオブジェクトなしで定数にアクセスすることに関するものだと思います。
セルジ

その場合は、単に{{ constant('Namespace\\Classname::CONSTANT_NAME') }}doc)と書いてください
Alexander Fedorov

これの良い点は、定数名として文字列リテラルの代わりにTwig変数を簡単に使用できることです。
CJデニス

わかりやすくするために。クラス内の定数を小枝変数として渡して、のよう{{ constant('TYPE_PERSON', entity) }}に使用したい場合は、次のようにすることができます(インスタンス化エンティティクラス)$this->render('index.html.twig', ['entity' => new Entity()]);
Alexandr Tsyganok

13

編集:私はより良い解決策を見つけました、それについてはこちらをお読みください。



あなたがクラスを持っているとしましょう:

namespace MyNamespace;
class MyClass
{
    const MY_CONSTANT = 'my_constant';
    const MY_CONSTANT2 = 'const2';
}

Twig拡張機能を作成して登録します。

class MyClassExtension extends \Twig_Extension
{
    public function getName()
    { 
        return 'my_class_extension'; 
    }

    public function getGlobals()
    {
        $class = new \ReflectionClass('MyNamespace\MyClass');
        $constants = $class->getConstants();

        return array(
            'MyClass' => $constants
        );
    }
}

これで、Twigで定数を使用できます。

{{ MyClass.MY_CONSTANT }}

12
したがって、各クラスのtwig拡張全体を定義することは、{{constant( 'Acme \\ DemoBundle \\ Entity \\ Demo :: MY_CONSTANT')}}を使用するよりも "醜い"とは言えません。また、クラス名が重複している場合はどうしますか?ここで名前空間の利点をすべて
失う

1
私は同様の解決策を持っていますが、これをバンドルに抽出するかもしれません。このソリューションの問題は、リフレクションのオーバーヘッドがあることです。symfonyでは、コンテナーがコンパイルされるときにこれを解決するためのコンパイラーパスを書くことができます。
誰でも

@ 0x1geneそうです、クラス名は重複する可能性があります。MyClassは単なるクラスではなく、プロジェクト内で非常に重要なクラスであると暗黙のうちに想定しました。また、十分に頻繁に使用されるためconstant()、FQNでの使用は面倒です。
ダミアンポラック

@DamianPolac PHPStormがtwigファイルで変数の選択を要求することを知っていますか?
Codium

12

名前空間を使用している場合

{{ constant('Namespace\\Entity::TYPE_COMPANY') }}

重要!シングルスラッシュではなく、ダブルスラッシュを使用する


9

Symfonyの本のベストプラクティスには、この問題に関するセクションがあります。

constant()関数のおかげで、たとえばTwigテンプレートで定数を使用できます。

// src/AppBundle/Entity/Post.php
namespace AppBundle\Entity;

class Post
{
    const NUM_ITEMS = 10;

   // ...
}

そして、テンプレート定数でこの定数を使用します:

<p>
    Displaying the {{ constant('NUM_ITEMS', post) }} most recent results.
</p>

ここにリンク:http : //symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options


4

数年後、私の以前の答えはあまり良くないことに気づきました。問題をよりよく解決する拡張機能を作成しました。オープンソースとして公開されています。

https://github.com/dpolac/twig-const

これは#、クラスの任意のオブジェクトを介してクラス定数にアクセスできる新しいTwigオペレーターを定義します。

そのように使用してください:

{% if entity.type == entity#TYPE_PERSON %}


アイデアをありがとう、私はこれを考えたことはありませんでした!たとえばUser#TYPE_PERSON、オブジェクトをインスタンス化せずにエンティティクラス名を使用する場合は、NodeExpressionクラスを次のように変更できます->raw('(constant(\'App\\Entity\\' . $this->getNode('left')->getAttribute('name') . '::' . $this->getNode('right')->getAttribute('name') . '\'))')。もちろん、これはクラスをApp\Entity名前空間に制限しますが、これは最も一般的なユースケースをカバーすると思います。
18年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.