ट्विग में वर्ग स्थिरांक का उपयोग कैसे करें?


133

मेरी इकाई वर्ग में कुछ वर्ग स्थिरांक हैं, जैसे:

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

सामान्य PHP में मैं अक्सर करता if($var == Entity::TYPE_PERSON)हूं और मैं इस तरह का सामान Twig में करना चाहूंगा। क्या यह संभव है?

जवाबों:


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

constantफ़ंक्शन और constantपरीक्षण के लिए दस्तावेज़ देखें ।


3
आपको अपने एवेज़ में ऑब्जेक्ट उदाहरण के साथ परीक्षण प्रतियोगियों को जोड़ना चाहिए{% if var is constant('TYPE_PERSON', object) %}
ioleo

1
जब मैंने @ नाम के संदेश की तरह नामस्थान टाइप किया तो काम किया।
crafter

232

बस अपना समय बचाने के लिए। यदि आपको नामस्थान के तहत कक्षा के स्थिरांक तक पहुंचने की आवश्यकता है, तो उपयोग करें

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

22
यह ध्यान रखना महत्वपूर्ण है कि डबल स्लैश महत्वपूर्ण हैं। मैंने कुछ मिनट बर्बाद किए क्योंकि मैंने डबल बैकस्लैश नहीं डाला।
डैन मॉर्फिस

धन्यवाद! तुम मेरा समय बचाओ! :)
sintetico82

7
वाह, यह बदसूरत है :-) यह अच्छा होगा यदि ट्विग लगातार अन्य गुणों / चर की तरह लग सकता है। जैसे{% if var == object.MY_CONSTANT %}
रिक हेवुड

27

1.12.1 के अनुसार आप ऑब्जेक्ट इंस्टेंस से स्थिरांक भी पढ़ सकते हैं:

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

यह केवल तभी काम करता है जब इकाई इकाई का एक उदाहरण है, मुझे लगता है कि प्रश्न टेम्पलेट में परिभाषित वस्तु के बिना एक निरंतर तक पहुंचने के बारे में है।
सर्गी

उस स्थिति में आप सिर्फ लिखते हैं {{ constant('Namespace\\Classname::CONSTANT_NAME') }}( डॉक्टर )
अलेक्जेंडर फेडोरोव

इसके बारे में यह अच्छा है कि यह स्ट्रिंग स्ट्रिंग शाब्दिक के बजाय एक स्थिर चर का उपयोग करना आसान बनाता है।
सीजे डेनिस

सिर्फ स्पष्टता के लिए। यदि आप एक वर्ग के भीतर स्थिरांक को ज्वलनशील के रूप में पारित करना चाहते हैं और इसका उपयोग करना चाहते हैं {{ constant('TYPE_PERSON', entity) }}, तो यह निम्न करना संभव है (तात्कालिक एंटिटी वर्ग)$this->render('index.html.twig', ['entity' => new Entity()]);
एलेक्जेंडर त्सयागोक

13

संपादित करें: मुझे बेहतर समाधान मिला है, इसके बारे में यहां पढ़ें।



मान लीजिए कि आपके पास कक्षा है:

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

ट्विग एक्सटेंशन बनाएं और पंजीकृत करें:

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

अब आप ट्विग में स्थिरांक का उपयोग कर सकते हैं जैसे:

{{ MyClass.MY_CONSTANT }}

12
तो {{स्थिरांक ('Acme \\ DemoBundle \\ Entity \\ डेमो :: MY_CONSTANT')}} का उपयोग करने की तुलना में प्रत्येक वर्ग के लिए पूरे टहनी विस्तार को कम करना "बदसूरत" है? और जब आपकी कक्षा के नाम ओवरलैप हो जाते हैं तो आप क्या करते हैं? आप यहां नामस्थानों के सभी लाभों को ढीला कर देते हैं
0x1gene

1
मेरे पास एक समान समाधान है, मैं इसे एक बंडल में निकाल सकता हूं। इस समाधान के साथ समस्या यह है कि आपके पास प्रतिबिंब ओवरहेड है। सिम्फनी में आप कंटेनर को संकलित करने के लिए इसे हल करने के लिए एक कंपाइलर पास लिख सकते हैं।
कोई भी

@ 0x1gene आप सही हैं, वर्ग नाम ओवरलैप कर सकते हैं। मैंने चुपचाप यह मान लिया कि MyClass सिर्फ किसी वर्ग की नहीं है, बल्कि एक वर्ग है जो परियोजना के भीतर बहुत महत्वपूर्ण है। और अक्सर उपयोग किया जाता है इसलिए constant()FQN के साथ उपयोग करना कष्टप्रद होगा।
डेमियन पोलाक

@DamianPolac क्या आपको पता है कि PHPStorm, टहनी फ़ाइल में चर चयन का संकेत देगा?
कोडिया

12

यदि आप नाम स्थान का उपयोग कर रहे हैं

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

जरूरी! सिंगल की जगह डबल स्लैश का इस्तेमाल करें


9

सिम्फनी की पुस्तक सर्वोत्तम प्रथाओं में इस मुद्दे के साथ एक खंड है:

स्थिरांक () फ़ंक्शन के लिए आपके ट्विग टेम्पलेट में उदाहरण के लिए स्थिरांक का उपयोग किया जा सकता है:

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

class Post
{
    const NUM_ITEMS = 10;

   // ...
}

और टेम्प्लेट टहनी में इस स्थिरांक का उपयोग करें:

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

यहाँ लिंक: http://symfony.com/doc/current/best_practices/configuration.html#constants-vs-configuration-options


4

कुछ वर्षों के बाद मुझे महसूस हुआ कि मेरा पिछला उत्तर वास्तव में इतना अच्छा नहीं है। मैंने विस्तार किया है जो समस्या को बेहतर तरीके से हल करता है। इसे ओपन सोर्स के रूप में प्रकाशित किया गया है।

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नामस्थान तक सीमित करता है, लेकिन मुझे लगता है कि यह सबसे आम उपयोग के मामले को कवर करता है।
भविष्य
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.