ฉันมีค่าคงที่ของคลาสสองสามตัวในคลาสเอนทิตีของฉันเช่น:
class Entity {
const TYPE_PERSON = 0;
const TYPE_COMPANY = 1;
}
ใน PHP ปกติฉันมักจะทำif($var == Entity::TYPE_PERSON)
และฉันต้องการทำสิ่งนี้ใน Twig เป็นไปได้ไหม?
ฉันมีค่าคงที่ของคลาสสองสามตัวในคลาสเอนทิตีของฉันเช่น:
class Entity {
const TYPE_PERSON = 0;
const TYPE_COMPANY = 1;
}
ใน PHP ปกติฉันมักจะทำif($var == Entity::TYPE_PERSON)
และฉันต้องการทำสิ่งนี้ใน Twig เป็นไปได้ไหม?
คำตอบ:
{% if var == constant('Namespace\\Entity::TYPE_PERSON') %}
{# or #}
{% if var is constant('Namespace\\Entity::TYPE_PERSON') %}
ดูเอกสารสำหรับconstant
ฟังก์ชั่นและการทดสอบconstant
เพียงเพื่อประหยัดเวลาของคุณ หากคุณต้องการเข้าถึงค่าคงที่ของคลาสภายใต้เนมสเปซให้ใช้
{{ constant('Acme\\DemoBundle\\Entity\\Demo::MY_CONSTANT') }}
{% if var == object.MY_CONSTANT %}
ตั้งแต่ 1.12.1 คุณสามารถอ่านค่าคงที่จากอินสแตนซ์ออบเจ็กต์ได้เช่นกัน:
{% if var == constant('TYPE_PERSON', entity)
{{ constant('Namespace\\Classname::CONSTANT_NAME') }}
( doc )
{{ constant('TYPE_PERSON', entity) }}
นั้นคุณสามารถทำสิ่งต่อไปนี้ได้ (สร้างอินสแตนซ์เอนทิตีคลาส)$this->render('index.html.twig', ['entity' => new Entity()]);
แก้ไข: ฉันพบทางออกที่ดีกว่าอ่านเกี่ยวกับเรื่องนี้ที่นี่
สมมติว่าคุณมีคลาส:
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 }}
constant()
กับ FQN จะน่ารำคาญ
หากคุณใช้เนมสเปซ
{{ constant('Namespace\\Entity::TYPE_COMPANY') }}
สิ่งสำคัญ! ใช้เครื่องหมายทับคู่แทนการใช้เดี่ยว
ในหนังสือแนวทางปฏิบัติที่ดีที่สุดของ Symfony มีส่วนที่เกี่ยวข้องกับปัญหานี้:
ค่าคงที่สามารถใช้เป็นตัวอย่างในเทมเพลต Twig ของคุณได้โดยใช้ฟังก์ชัน constant ():
// src/AppBundle/Entity/Post.php
namespace AppBundle\Entity;
class Post
{
const NUM_ITEMS = 10;
// ...
}
และใช้ค่าคงที่นี้ในแม่แบบ twig:
<p>
Displaying the {{ constant('NUM_ITEMS', post) }} most recent results.
</p>
ที่นี่ลิงค์: http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options
ผ่านไปหลายปีฉันก็รู้ว่าคำตอบก่อนหน้านี้ไม่ค่อยดีนัก ฉันได้สร้างส่วนขยายที่แก้ปัญหาได้ดีขึ้น เผยแพร่เป็นโอเพ่นซอร์ส
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
เนมสเปซ แต่ฉันคิดว่ามันครอบคลุมกรณีการใช้งานที่พบบ่อยที่สุด
{% if var is constant('TYPE_PERSON', object) %}