Làm thế nào để truy cập các hằng số lớp trong Twig?


133

Tôi có một vài hằng số lớp trong lớp thực thể của mình, ví dụ:

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

Trong PHP bình thường tôi thường làm if($var == Entity::TYPE_PERSON)và tôi muốn làm loại công cụ này trong Twig. Có thể không?

Câu trả lời:


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

Xem tài liệu cho constantchức năngconstantkiểm tra .


3
Bạn nên thêm các thử nghiệm với đối tượng đối tượng vào anwser của mình{% if var is constant('TYPE_PERSON', object) %}
ioleo

1
Hoạt động khi tôi gõ không gian tên, như tin nhắn của @ message.
crafter

232

Chỉ để tiết kiệm thời gian của bạn. Nếu bạn cần truy cập các hằng lớp trong không gian tên, hãy sử dụng

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

22
Điều quan trọng cần lưu ý là dấu gạch chéo kép rất quan trọng. Tôi đã lãng phí một vài phút vì tôi đã không đặt dấu gạch chéo kép vào.
Dan Morp4

Cảm ơn bạn! bạn tiết kiệm thời gian của tôi :)
sintetico82

7
Wow, thật là xấu xí :-) Thật tuyệt nếu Twig có thể làm cho các hằng số trông giống như các thuộc tính / biến khác. ví dụ{% if var == object.MY_CONSTANT %}
Rik Heywood

27

Kể từ 1.12.1, bạn cũng có thể đọc các hằng số từ các thể hiện đối tượng:

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

Điều này chỉ hoạt động nếu thực thể là một thể hiện của Thực thể, tôi nghĩ rằng câu hỏi là về việc truy cập một hằng số không có đối tượng được xác định trong mẫu.
Sergi

Trong trường hợp đó, bạn chỉ cần viết {{ constant('Namespace\\Classname::CONSTANT_NAME') }}( doc )
Alexander Fedorov

Điều tốt ở đây là nó giúp bạn dễ dàng sử dụng biến Twig thay vì chuỗi ký tự như tên hằng.
CJ Dennis

Chỉ cho rõ ràng. Nếu bạn muốn vượt qua các hằng số trong một lớp dưới dạng twig khả thi và sử dụng nó như thế nào {{ constant('TYPE_PERSON', entity) }}, bạn có thể thực hiện theo (ngay lập tức lớp Thực thể)$this->render('index.html.twig', ['entity' => new Entity()]);
Alexandr Tsyganok

13

Chỉnh sửa: Tôi đã tìm thấy giải pháp tốt hơn, đọc về nó ở đây.



Giả sử bạn có lớp:

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

Tạo và đăng ký tiện ích mở rộng 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
        );
    }
}

Bây giờ bạn có thể sử dụng các hằng số trong Twig như:

{{ MyClass.MY_CONSTANT }}

12
Vì vậy, việc xác định toàn bộ tiện ích mở rộng twig cho mỗi lớp sẽ ít "xấu" hơn so với sử dụng {{hằng ('Acme \\ DemoBundle \\ Entity \\ Demo :: MY_CONSTANT')}}? Và bạn sẽ làm gì khi tên lớp của bạn trùng lặp? bạn mất tất cả lợi ích của không gian tên ở đây
0x1gene

1
Tôi có một giải pháp tương tự, mặc dù tôi có thể trích xuất nó thành một gói. Vấn đề với giải pháp này là bạn có chi phí phản ánh. Trong symfony bạn có thể viết một trình biên dịch để giải quyết điều này khi container được biên dịch.
Bất cứ ai vào

@ 0x1gene Bạn nói đúng, tên lớp có thể trùng nhau. Tôi âm thầm cho rằng MyClass không chỉ là bất kỳ lớp nào, mà là một lớp rất quan trọng trong dự án. Và được sử dụng thường xuyên đủ để sử dụng constant()với FQN sẽ gây khó chịu.
Damian Polac

@DamianPolac bạn có biết PHPStorm sẽ nhắc lựa chọn biến trong tệp twig không?
Codium

12

Nếu bạn đang sử dụng không gian tên

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

Quan trọng! Sử dụng dấu gạch chéo kép, thay vì đơn


9

Trong cuốn sách thực hành tốt nhất của Symfony có một phần về vấn đề này:

Các hằng số có thể được sử dụng ví dụ trong các mẫu Twig của bạn nhờ hàm hằng ():

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

class Post
{
    const NUM_ITEMS = 10;

   // ...
}

Và sử dụng hằng số này trong twig mẫu:

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

Tại đây, liên kết: http://symfony.com/doc/cản/best_practices/configuration.html#constants-vs-configuration-options


4

Sau một vài năm tôi nhận ra rằng câu trả lời trước đây của tôi không thực sự tốt như vậy. Tôi đã tạo ra phần mở rộng giải quyết vấn đề tốt hơn. Nó được xuất bản dưới dạng nguồn mở.

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

Nó định nghĩa toán tử Twig mới #cho phép bạn truy cập hằng số lớp thông qua bất kỳ đối tượng nào của lớp đó.

Sử dụng nó như thế:

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


Cảm ơn ý tưởng, tôi chưa bao giờ nghĩ về điều này! Ví dụ User#TYPE_PERSON, nếu bạn muốn sử dụng tên lớp thực thể mà không cần khởi tạo đối tượng, NodeExpressionlớp có thể được thay đổi thành tên như thế này, hoạt động với tôi : ->raw('(constant(\'App\\Entity\\' . $this->getNode('left')->getAttribute('name') . '::' . $this->getNode('right')->getAttribute('name') . '\'))'). Tất nhiên, điều này giới hạn các lớp của bạn trong App\Entitykhông gian tên, nhưng tôi nghĩ rằng nó bao gồm trường hợp sử dụng phổ biến nhất.
tương lai
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.