Twig에서 클래스 상수에 액세스하는 방법?


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
객체 인스턴스가있는 테스트 상수를 anwser에 추가해야합니다.{% if var is constant('TYPE_PERSON', object) %}
— ioleo

1
@message의 메시지와 같이 네임 스페이스를 입력했을 때 작동했습니다.
— crafter

232

시간을 절약하기 위해. 네임 스페이스에서 클래스 상수에 액세스해야하는 경우

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

22
이중 슬래시가 중요하다는 점에 유의해야합니다. 이중 백 슬래시를 넣지 않았기 때문에 몇 분을 낭비했습니다.
— Dan Morphis

감사합니다! 당신은 내 시간을 절약! :)
— sintetico82

7
와우, 그것은 추악합니다 :-) 나뭇 가지가 상수를 다른 속성 / 변수처럼 보이게 할 수 있다면 좋을 것입니다. 예{% if var == object.MY_CONSTANT %}
— Rik Heywood

27

1.12.1부터 객체 인스턴스에서도 상수를 읽을 수 있습니다.

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

엔티티가 엔티티의 인스턴스 인 경우에만 작동합니다. 템플릿에 정의 된 객체가없는 상수에 액세스하는 것이 문제라고 생각합니다.
— Sergi

이 경우에 당신은 {{ constant('Namespace\\Classname::CONSTANT_NAME') }}( doc )
— Alexander Fedorov

이것에 대한 좋은 점은 문자열 리터럴 대신 Twig 변수를 상수 이름으로 쉽게 사용할 수 있다는 것입니다.
— CJ 데니스

명확성을 위해. 클래스 내에서 나뭇 가지 vriable로 상수를 전달하고 {{ 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
        );
    }
}

이제 다음과 같이 Twig에서 상수를 사용할 수 있습니다.

{{ MyClass.MY_CONSTANT }}

12
따라서 각 클래스에 대해 전체 나뭇 가지 확장을 정의하는 것은 {{constant ( 'Acme \\ DemoBundle \\ Entity \\ Demo :: MY_CONSTANT')}} 사용하는 것보다 덜 추악합니다. 수업 이름이 겹치면 어떻게해야합니까? 당신은 모두에게 여기 네임 스페이스의 이익 느슨한
— 0x1gene

1
비슷한 솔루션이 있지만 번들로 추출 할 수 있습니다. 이 솔루션의 문제점은 리플렉션 오버 헤드가 있다는 것입니다. symfony에서는 컨테이너가 컴파일 될 때이를 해결하기 위해 컴파일러 패스를 작성할 수 있습니다.
— 누구나

@ 0x1gene 맞습니다. 클래스 이름이 겹칠 수 있습니다. 나는 조용히 MyClass는 단지 클래스가 아니라 프로젝트 내에서 매우 중요한 클래스라고 가정했다. 그리고 자주 사용되므로 constant()FQN과 함께 사용 하면 번거로울 수 있습니다.
— Damian Polac

@DamianPolac PHPStorm이 작은 파일에서 변수 선택을 촉구한다는 것을 알고 있습니까?
— Codium

12

네임 스페이스를 사용하는 경우

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

중대한! 단일 대신 이중 슬래시를 사용하십시오.


9

Symfony의 모범 사례에이 문제에 대한 섹션이 있습니다.

constant () 함수 덕분에 Twig 템플릿에서 상수를 사용할 수 있습니다.

// 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네임 스페이스로 제한 하지만 가장 일반적인 사용 사례를 다루고 있다고 생각합니다.
— 미래의
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.