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.