Twig'de sınıf sabitlerine nasıl erişilir?


133

Varlık sınıfımda birkaç sınıf sabitim var, örneğin:

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

Normal PHP'de sık sık yaparım if($var == Entity::TYPE_PERSON)ve bu tür şeyleri Twig'de yapmak isterim. Mümkün mü?

Yanıtlar:


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

constantİşlev ve constanttest için belgelere bakın .


3
Yanıtlayıcınıza nesne örneğiyle test içeriği eklemelisiniz{% if var is constant('TYPE_PERSON', object) %}
— ioleo

1
@ Mesajın mesajı gibi ad alanını yazdığımda çalıştı.
— crafter

232

Sadece zamandan tasarruf etmek için. Ad alanı altındaki sınıf sabitlerine erişmeniz gerekiyorsa, şunu kullanın:

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

22
Çift eğik çizgilerin önemli olduğuna dikkat etmek önemlidir. Çift ters eğik çizgileri koymadığım için birkaç dakikamı boşa harcadım.
— Dan Morphis

Teşekkür ederim! zamanımı kurtarıyorsun! :)
— sintetico82

7
Vay canına, bu çirkin :-) Twig, sabitleri diğer özellikler / değişkenler gibi gösterebilseydi iyi olurdu. örneğin{% if var == object.MY_CONSTANT %}
— Rik Heywood

27

1.12.1'den itibaren sabitleri nesne örneklerinden de okuyabilirsiniz:

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

Bu yalnızca varlık bir Varlık örneğiyse işe yarar, bence soru şablonda tanımlanmış bir nesne olmadan bir sabite erişme ile ilgili.
— Sergi

Bu durumda sadece {{ constant('Namespace\\Classname::CONSTANT_NAME') }}( doc ) yazın
— Alexander Fedorov

Bunun iyi yanı, sabit isim olarak bir dizge dizesi yerine bir Twig değişkeninin kullanılmasını kolaylaştırmasıdır.
— CJ Dennis

Sadece netlik için. Bir sınıftaki sabitleri ince dal olarak geçirmek ve onu olduğu gibi kullanmak istiyorsanız {{ constant('TYPE_PERSON', entity) }}, şunu yapmak mümkündür (Varlık sınıfını somutlaştırmak)$this->render('index.html.twig', ['entity' => new Entity()]);
— Alexandr Tsyganok

13

Düzenleme: Daha iyi bir çözüm buldum, buradan okuyun.



Diyelim ki dersiniz var:

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

Twig uzantısı oluşturun ve kaydedin:

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
        );
    }
}

Şimdi Twig'de sabitleri şu şekilde kullanabilirsiniz:

{{ MyClass.MY_CONSTANT }}

12
Yani her sınıf için bir dal uzantısının tamamını tanımlamak, {{sabit ('Acme \\ DemoBundle \\ Entity \\ Demo :: MY_CONSTANT')}} kullanmaktan daha az "çirkin" mi? Ve sınıf isimleriniz örtüştüğünde ne yaparsınız? burada ad alanlarının tüm avantajlarını
— kaybediyorsunuz

1
Benzer bir çözümüm var, yine de bunu bir pakete çıkarabilirim. Bu çözümle ilgili sorun, yansıma yükünüzün olmasıdır. Symfony'de, konteyner derlendiğinde bunu çözmek için bir derleyici geçişi yazabilirsiniz.
— herkes

@ 0x1gene Haklısınız, sınıf isimleri çakışabilir. Sessizce MyClass'ın herhangi bir sınıf olmadığını, proje içinde çok önemli olan bir sınıf olduğunu varsaydım. Yeterince sık kullanıldığından constant(), FQN ile kullanmak can sıkıcı olabilir.
— Damian Polac

@DamianPolac PHPStorm'un twig dosyasında değişken seçimi isteyeceğini biliyor musunuz?
— Codium

12

Ad alanları kullanıyorsanız

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

Önemli! Tek yerine çift eğik çizgi kullanın


9

Symfony'nin en iyi uygulamaları kitabında bu konuyla ilgili bir bölüm var:

Sabitler, sabit () işlevi sayesinde örneğin Twig şablonlarınızda kullanılabilir:

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

class Post
{
    const NUM_ITEMS = 10;

   // ...
}

Ve bu sabiti şablon dalında kullanın:

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

İşte bağlantı: http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options


4

Birkaç yıl sonra, önceki cevabımın pek de iyi olmadığını anladım. Sorunu daha iyi çözen uzantı oluşturdum. Açık kaynak olarak yayınlanmıştır.

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

Bu #sınıfın herhangi bir nesnesi aracılığıyla sınıf sabitine erişmenizi sağlayan yeni Twig operatörünü tanımlar .

Bunu şu şekilde kullanın:

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


Fikir için teşekkürler, bunu hiç düşünmemiştim! Nesneleri başlatmasını olmadan varlık sınıfı adlarını kullanmak isterseniz, örneğin User#TYPE_PERSON, NodeExpressionsınıf benim için çalıştı Böyle bir şey, şeklinde değiştirilebilir: ->raw('(constant(\'App\\Entity\\' . $this->getNode('left')->getAttribute('name') . '::' . $this->getNode('right')->getAttribute('name') . '\'))'). Elbette bu, sınıflarınızı App\Entityad alanıyla sınırlar , ancak bunun en yaygın kullanım durumunu kapsadığını düşünüyorum.
— Futureal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.