Twig: オブジェクトプロパティへの動的アクセス

作成日 2010年04月05日  ·  17コメント  ·  ソース: twigphp/Twig

obj ['prop']は、objが配列の場合にのみ値を返し、変数に名前がある場合はオブジェクトプロパティを取得する方法はありません。obj[propName]はnullを返します。

最も参考になるコメント

あなたは試すことができます
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

全てのコメント17件

配列とオブジェクトの両方をチェックするドット表記を使用できるため、obj.nameは最初にobj ['name']を検索し、次にobj-> name、最後にobj-> getName()を検索します。これについても、ドキュメントで詳しく説明されています。デザイナーのための小枝の章の下。

artyvの問題は、単にオフセット/プロパティにアクセスするのではなく、オブジェクトのプロパティに動的にアクセスすることに関するものだと思います。 私のサンプルコードを参照してください。

/* php */
$obj = new stdClass;
$obj->foo = "bar";
$template->render(array('obj, $obj));

/* twig */
{% set prop as "foo" %}
{{ obj.foo }} 
// outputs "bar" 

{{ obj.$prop }} 
// (pseudo-code)
// would compile down to {{ obj.foo }} and output "bar"

jwpageは正しいです、プロパティ名、取得する必要があるのは他の変数にあるので、このphpコードと同等のものが必要です:
$ obj-> {$ propName}
$ objは単純なオブジェクトであり、ArrayAccessを実装していないためです

この機能はTwigには含まれません。 Twigはテンプレートシステムであり、完全な機能を備えた言語ではありません。 動的プロパティは明らかにTwigの範囲外です。

シリアライザーコンポーネントを使用して、ネストされたstdClassインスタンスをネストされた配列に変換できると思います。

stdClassを配列に型キャストするだけで、変換されると思います。 なぜそれを以前よりも難しくするのですか:)

[~] php -r '$class = new stdClass;$class->prop = "hejsa";print_r((array) $class);'      
Array
(
    [prop] => hejsa
)

@henrikbjorn :はい、型キャストは機能しますが、再帰的には機能しません。そのため、

同じ問題があり、フィルターを使用して解決しました。 私はそれが物事を行う正しい方法ではないことを知っていますが、それは確かに最もきれいに思えます。

基本的にそれはこれに要約されます:

function twig_get_filter()
{
    $params = func_get_args();
    $object = array_shift($params);
    $field = implode('', $params);
    return $object->$field;
}

そして、あなたはそれを次のように使うことができます:

{{ object|get(text, '_', language, '_', type) }}

動的プロパティは明らかにTwigの範囲外です。

どうして? 私はsymfonydatagridのようなものを開発しようとしていますが、次のようなものを使用したいと思います。

{# columns #}
{% for name, column in grid.columns %}
<td>{{ column.render(row[name])|raw }}</td>
{% endfor %}

データグリッドにTwig_Template :: getAttributeメソッドのようなものを実装するよりも良い解決策はありません。 私はそれがどれほど普遍的であるかが好きです。

これはエッジケースであり、必要なことを非常に簡単に実行する関数を簡単に作成できるためです(テストされていません)。

function twig_array_get_function($array, $name)
{
    return $array[$name];
}

使用法:

row|array_get(name)

はい、アレイの場合は簡単です。 問題は、Twigですでに実装されているオブジェクトなどのゲッターへのアクセスも実装する必要があることです(ただし、このコードを使用する方法はありません)。

朗報です! 1.2以降、新しいattribute関数を介して変数の動的属性を取得できるようになりました(c609060を参照)。

このためのサポートが追加されました。 Twigを使い始めたばかりです。 構文を次のようなものに変更するのはどれほど難しいでしょうか

{{object。{property}}}または{{object。{method}(attrs)}}

{{attribute(object、method、arguments)}}よりも少しクリーンだと思います

おそらくあなたは私を正しい方向に向けることができますか? 私はまだすべてのソースコードを調べていません。

@ rspenc29 :これをテンプレートで使用する前によく考えてほしいので、「よりクリーン」にしたくありません。 ほとんどの場合、これは注意して使用する必要があります。他の場所で実行する必要があるテンプレートで何かを実行しているのはにおいです。

問題なし。 私はそれを理解します。

asd専用

あなたは試すことができます
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

このページは役に立ちましたか?
0 / 5 - 0 評価