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.