টুইগের ক্লাস কনস্ট্যান্টগুলি কীভাবে অ্যাক্সেস করবেন?


133

আমার সত্তা শ্রেণিতে আমার কয়েকটি শ্রেণির ধ্রুবক রয়েছে, যেমন:

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

সাধারণ পিএইচপিতে আমি প্রায়শই করি if($var == Entity::TYPE_PERSON)এবং আমি টুইগের মধ্যে এই জাতীয় জিনিসটি করতে চাই। এটা কি সম্ভব?

উত্তর:


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
আমি যখন @ বার্তাটির বার্তার মতো নেমস্পেস টাইপ করতাম তখন কাজ করতাম।
10:54

232

শুধু আপনার সময় বাঁচাতে। আপনার যদি নেমস্পেসের অধীনে শ্রেণিবদ্ধ অ্যাক্সেসের প্রয়োজন হয় তবে ব্যবহার করুন

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

22
ডাবল স্ল্যাশ গুরুত্বপূর্ণ তা লক্ষ করা গুরুত্বপূর্ণ। আমি কয়েক মিনিট নষ্ট করেছিলাম কারণ আমি ডাবল ব্যাকস্ল্যাশগুলি in
োকা নি

ধন্যবাদ! তুমি আমার সময় বাঁচাও! :)
sintetico82

7
বাহ, এটি কুরুচিপূর্ণ :-) ভাল লাগবে যদি টুইগ কনস্ট্যান্টদের অন্য বৈশিষ্ট্য / ভেরিয়েবলের মতো দেখায়। যেমন{% if var == object.MY_CONSTANT %}
রিক হেইউড

27

1.12.1 হিসাবে আপনি অবজেক্টের উদাহরণগুলি থেকে ধ্রুবকগুলিও পড়তে পারেন:

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

এটি কেবলমাত্র সত্তা সত্তার উদাহরণ হিসাবে কাজ করে, আমি মনে করি যে প্রশ্নটি টেমপ্লেটে কোনও সংজ্ঞায়িত অবজেক্ট ছাড়াই ধ্রুবক অ্যাক্সেস সম্পর্কে is
সের্গি

সেক্ষেত্রে আপনি কেবল {{ 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
সুতরাং class {ধ্রুবক ('একেমি \\ ডেমোবান্ডেল \\ সত্তা \\ ডেমো :: এমওয়াই_সন্ট্যান্ট')} using ব্যবহারের চেয়ে প্রতিটি শ্রেণীর জন্য একটি পুরো দ্বিগুন প্রসারকে সংজ্ঞায়িত করা "কুশ্রী" কম? এবং যখন আপনার শ্রেণীর নামগুলি ওভারল্যাপ হয় আপনি কি করবেন? আপনি এখানে নেমস্পেসের সমস্ত সুবিধা আলগা করে
রেখেছেন

1
আমারও অনুরূপ সমাধান রয়েছে, যদিও আমি এটি বান্ডলে বের করতে পারি। এই সমাধানটির সাথে সমস্যাটি হ'ল আপনার প্রতিচ্ছবি ওভারহেড। সিমফোনিতে আপনি যখন কনটেইনারটি সংকলিত হয় তখন এটি সমাধান করার জন্য একটি সংকলক পাস লিখতে পারেন।
যে কোনও

@ 0x1gene আপনি ঠিক বলেছেন, শ্রেণীর নামগুলি ওভারল্যাপ করতে পারে। আমি নিঃশব্দে ধরে নিয়েছি যে মাইক্লাস কেবল কোনও শ্রেণি নয়, এমন একটি শ্রেণী যা প্রকল্পের মধ্যে অত্যন্ত গুরুত্বপূর্ণ। এবং প্রায়শই যথেষ্ট ব্যবহৃত তাই constant()FQN এর সাথে ব্যবহার করা বিরক্তিকর হবে।
দামিয়ান পোলাক

@ ডামিয়ানপোল্যাক আপনি কি জানেন পিএইচপিএসটারম টুইগ ফাইলের মধ্যে পরিবর্তনশীল নির্বাচন প্রম্পট করবে?
কোডিয়াম


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/configration.html#constants-vs-configration-options


4

কয়েক বছর পরে আমি বুঝতে পারি যে আমার আগের উত্তরটি এতটা ভাল নয়। আমি এক্সটেনশন তৈরি করেছি যা সমস্যার আরও ভাল সমাধান করে। এটি ওপেন সোর্স হিসাবে প্রকাশিত।

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

এটি নতুন টুইগ অপারেটরটিকে সংজ্ঞায়িত করে #যা আপনাকে ক্লাসের যে কোনও অবজেক্টের মাধ্যমে ধ্রুবক অ্যাক্সেস করতে দেয়।

এটি এর মতো ব্যবহার করুন:

{% 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নামের জায়গার মধ্যে সীমাবদ্ধ করে , তবে আমি মনে করি এটি সর্বাধিক প্রচলিত ব্যবহারের ক্ষেত্রে কভার করে।
ভবিষ্যতে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.