twig Как проверить, является ли объект экземпляром класса? (instanceOf)

К сожалению, функции проверки на принадлежность к классу в twig нет.

На просторах интернета можно найти рекомендации по самостоятельному расширению возможностей шаблонизатора.

И несомненно данное решение более надёжное.

Но есть и более простой путь (для ленивых)). Сделать проверку is defined для поля/метода, присутствующего только в одном из классов:

// Допустим, у нас есть неоплаченое и оплаченое платёжное поручение, наследуемое от первого 
// Вместо того, чтобы делать проверку на класс, проверим, есть ли у нашего п/п поле Дата оплаты
    {%if paymentOrder.paidDate is defined%}
        <div>№ {{paymentOrder.number}}</div>
        <div>от {{paymentOrder.paidDate|date('d.m.Y')}}</div>
    {%else%}
        <div>Не оплачено</div>
    {%endif%}

Внимание!
Недостаток этого решения в его неочевидности (непонятно, зачем проверяется наличие поля/метода, если дальше нет его использования).
А также в опасности появления логических ошибок в случае, если Вы изменили/удалили поле/его название, и знать не знали, что на нём завязана какая-то проверка в шаблоне.

Будьте бдительны ;)

Источники

vedro-compota's picture

Недостаток этого решения в его неочевидности

тогда уж надо добавлять поле типа "type" или вообще отдельно помечать объекты выше, до передачи во view.

_____________
матфак вгу и остальная классика =)

melisa's picture

1) да, конечно, можно решить вопрос на уровне php, здесь представлен лишь один из вариантов решения.
2) что касается поля type - да, это ещё один вариант решения. В моём же случае это лишнее: бизнес логикой предусмотрено, что объекты Неоплаченое п/п и Оплаченое п/п всегда отличаются полем дата оплаты.
Как говорится, ради него вся песня и писалась ;)

vedro-compota's picture

объекты Неоплаченое п/п и Оплаченое п/п всегда отличаются полем дата оплаты.

это не отменяет неочевидности кода, для человека не знакомого с бизнес логикой, по такому коду понять её куда труднее. Поле типа можно делать динамическим/виртуальным - -то только для сортировки по view, без хранения в бд

_____________
матфак вгу и остальная классика =)