Twig: Akses dinamis ke properti objek

Dibuat pada 5 Apr 2010  ·  17Komentar  ·  Sumber: twigphp/Twig

obj['prop'] akan mengembalikan nilai hanya jika obj adalah array dan tidak ada cara untuk mendapatkan properti objek jika kita memiliki namanya dalam variabel: obj[propName] akan mengembalikan null

Komentar yang paling membantu

Kamu bisa mencoba
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

Semua 17 komentar

anda dapat menggunakan notasi titik yang akan memeriksa array dan objek sehingga obj.name akan mencari obj['name'] terlebih dahulu kemudian obj->name dan terakhir obj->getName() ini juga dijelaskan lebih lanjut dalam dokumentasi di bawah bab Ranting untuk desainer.

Saya pikir masalah artyv adalah tentang mengakses properti objek secara dinamis daripada hanya mengakses offset/properti. Lihat kode contoh saya.

/* 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 benar, nama properti, yang perlu saya dapatkan ada di variabel lain, jadi saya perlu yang setara dengan kode php ini:
$obj->{$propName}
karena $obj adalah objek sederhana dan tidak mengimplementasikan ArrayAccess

Fitur ini tidak akan disertakan dalam Twig. Twig adalah sistem templat, bukan bahasa berfitur lengkap. Properti dinamis jelas di luar lingkup Twig.

saya kira komponen serializer dapat digunakan untuk mengonversi instance stdClass bersarang ke array bersarang.

saya pikir hanya dengan mengetikkan stdClass ke array, itu akan dikonversi. Mengapa membuatnya lebih sulit dari yang sudah ada :)

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

@henrikbjorn : ya jenis casting berfungsi, namun tidak berfungsi secara rekursif itulah sebabnya saya menyarankan komponen serializer. jelas jika Anda tahu bahwa Anda tidak memiliki struktur yang sangat bersarang maka jelas hanya dilemparkan ke array dan Anda selesai.

Saya memiliki masalah yang sama dan saya menyelesaikannya menggunakan filter. Saya tahu ini bukan cara yang tepat untuk melakukan sesuatu, tetapi tampaknya itu yang paling bersih.

Pada dasarnya bermuara pada ini:

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

Dan Anda dapat menggunakannya sebagai berikut:

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

Properti dinamis jelas di luar lingkup Twig.

Mengapa? Saya mencoba mengembangkan sesuatu seperti symfony datagrid dan saya ingin menggunakan sesuatu seperti ini:

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

Saya tidak dapat melihat solusi yang lebih baik daripada menerapkan sesuatu seperti metode Twig_Template::getAttribute di datagrid saya. Saya suka betapa universalnya itu.

Karena ini adalah kasus tepi dan karena Anda dapat dengan mudah membuat fungsi yang melakukan apa yang Anda inginkan dengan cukup mudah (belum diuji):

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

Penggunaan:

row|array_get(name)

Ya, untuk array itu mudah. Masalahnya adalah saya harus mengimplementasikan juga mengakses getter objek dll yang sudah diimplementasikan di Twig (tetapi tidak ada cara bagaimana menggunakan kode ini).

Kabar baik! Mulai 1.2, Anda sekarang bisa mendapatkan atribut dinamis pada variabel melalui fungsi attribute (lihat c609060).

Senang melihat dukungan telah ditambahkan untuk ini. Saya baru saja mulai dengan Twig. Seberapa sulitkah mengubah sintaks menjadi sesuatu seperti

{{ objek.{properti} }} atau {{ objek.{metode}(attrs) }}

Saya pikir ini sedikit lebih bersih daripada {{ atribut(objek, metode, argumen) }}

Mungkin Anda bisa mengarahkan saya ke arah yang benar? Saya belum membaca semua kode sumber.

@ rspenc29 : Saya tidak ingin menjadikannya "lebih bersih" karena saya ingin Anda berpikir dua kali sebelum menggunakan ini dalam templat. Ini harus digunakan dengan hati-hati karena sebagian besar waktu, ini adalah bau bahwa Anda melakukan sesuatu dalam template yang harus dilakukan di tempat lain.

tidak masalah. Saya akan cari tahu.

asd deded

Kamu bisa mencoba
{{ attribute(object, method) }}
{{attribute(obj, foo)}}
http://twig.sensiolabs.org/doc/2.x/functions/attribute.html

Apakah halaman ini membantu?
0 / 5 - 0 peringkat