Saya memiliki beberapa konstanta kelas di kelas entitas saya, misalnya:
class Entity {
const TYPE_PERSON = 0;
const TYPE_COMPANY = 1;
}
Dalam PHP normal saya sering melakukannya if($var == Entity::TYPE_PERSON)
dan saya ingin melakukan hal semacam ini di Twig. Apa itu mungkin?
{% if var is constant('TYPE_PERSON', object) %}
Hanya untuk menghemat waktu Anda. Jika Anda perlu mengakses konstanta kelas di bawah namespace, gunakan
sumber
{% if var == object.MY_CONSTANT %}
Pada 1.12.1 Anda dapat membaca konstanta dari instance objek juga:
sumber
{{ constant('Namespace\\Classname::CONSTANT_NAME') }}
( doc ){{ constant('TYPE_PERSON', entity) }}
, dimungkinkan untuk mengikuti (instantiate Entity class)$this->render('index.html.twig', ['entity' => new Entity()]);
Sunting: Saya telah menemukan solusi yang lebih baik, baca di sini.
Katakanlah Anda memiliki kelas:
Buat dan daftarkan ekstensi Twig:
Sekarang Anda dapat menggunakan konstanta di Twig seperti:
sumber
constant()
FQN akan menyusahkan.Jika Anda menggunakan ruang nama
Penting! Gunakan garis miring ganda, bukan tunggal
sumber
Dalam buku praktik terbaik Symfony ada bagian dengan masalah ini:
Dan gunakan konstanta ini dalam ranting templat:
Berikut tautannya: http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options
sumber
Setelah beberapa tahun saya menyadari bahwa jawaban saya sebelumnya tidak begitu baik. Saya telah membuat ekstensi yang memecahkan masalah dengan lebih baik. Ini diterbitkan sebagai sumber terbuka.
https://github.com/dpolac/twig-const
Ini mendefinisikan operator ranting baru
#
yang memungkinkan Anda mengakses konstanta kelas melalui objek apa pun dari kelas itu.Gunakan seperti itu:
{% if entity.type == entity#TYPE_PERSON %}
sumber
User#TYPE_PERSON
, yangNodeExpression
kelas bisa berubah menjadi sesuatu seperti ini, yang bekerja untuk saya:->raw('(constant(\'App\\Entity\\' . $this->getNode('left')->getAttribute('name') . '::' . $this->getNode('right')->getAttribute('name') . '\'))')
. Tentu saja, ini membatasi kelas Anda keApp\Entity
namespace, tapi saya pikir itu mencakup kasus penggunaan yang paling umum.