Каковы реальные преимущества шаблонизаторов перед использованием только PHP? - PullRequest
28 голосов
/ 25 февраля 2010

Я разрабатываю свои веб-приложения, используя только PHP для просмотра файлов, и я не чувствую себя каким-либо образом ограниченным, но я слышал, что есть постоянное число разработчиков, отстаивающих «внешние» шаблоны. Так что же предлагают движки шаблонов, которых нет в простом PHP?

Я ищу практичные вещи, поэтому исключаю следующее:

  • присмотр за плохими разработчиками (т. Е. Используйте шаблонизатор, потому что он заставляет вас не смешивать код в презентации)
  • краткость синтаксиса (у меня есть сопоставления в Vim для таких вещей, как <?php echo $stuff; ?>, использование фигурных скобок не будет иметь никакого значения)
  • упрощенный синтаксис для не программистов (я разрабатываю один, так что это не проблема)

Ответы [ 10 ]

22 голосов
/ 25 февраля 2010

Новый синтаксис


Некоторые люди не соглашаются, но, поскольку я использую Twig, «для ... другого» кажется правильным. Это может быть немного, но это делает мои шаблоны немного чище.

{% for row in articles %}
 Display articles ...
{% else %}
 No articles.
{% endfor %}

Автоматический побег


Вы можете заставить механизм шаблонов автоматически экранировать любой вывод. Это здорово, так как вам больше не нужно повторять htmlspecialchars ... везде. Twig делает это красиво.

{% autoescape on %}
  Everything will be automatically escaped in this block
{% endautoescape %}

Наследование шаблонов


Еще одна функция, которая мне нравится, - это возможность расширять базовые шаблоны. Вот базовый пример

шаблон base.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  {% block head %}
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}{% endblock %} - My Webpage</title>
  {% endblock %}
</head>
<body>
  <div id="content">{% block content %}{% endblock %}</div>
  <div id="footer">
    {% block footer %}
      &copy; Copyright 2009 by <a href="http://domain.invalid/">you</a>.
    {% endblock %}
  </div>
</body>

шаблон child.html

{% extends "base.html" %}

{% block title %}Index{% endblock %}
{% block head %}
  {% parent %}
  <style type="text/css">
    .important { color: #336699; }
  </style>
{% endblock %}
{% block content %}
  <h1>Index</h1>
  <p class="important">
    Welcome on my awesome homepage.
  </p>
{% endblock %}

Дочерний шаблон может переопределять блоки для определенных для страницы стилей, содержимого и т. Д. Вы также можете заметить использование {% parent%}, который захватывает родительский контент, чтобы вы не потеряли его при переопределении. *

Рекомендую попробовать Веточка . Чрезвычайно полезно.

10 голосов
/ 25 февраля 2010

Разделение интересов.

Подобные вещи являются стандартными при использовании подхода MVC / MTV - когда представление данных обязательно отделено от отображения данных, но неесли вы используете обычный старый PHP.

Использование механизма шаблонов позволяет легко отделить отображаемое от отображаемого.

Полагаю, вы могли бы утверждать, что это подпадает под«присматривать за плохими разработчиками», поскольку хороший разработчик должен делать это в любом случае, но, на мой взгляд, механизм шаблонов облегчает работу и хороших разработчиков.

8 голосов
/ 25 февраля 2010

Простое переключение между представлениями

Учитывая текущее состояние сети, мне необходимо предоставить информацию в разных форматах:

  • Статическая HTML-страница
  • Динамически загружаемое представление на другой HTML-странице
  • JSON-объект данных
  • XML-поток данных, использованных в моей флэш-части

Информация для этих форматов может быть одинаковой, отличается только вид. Используя какой-то шаблонизатор, я могу быстро переключаться между этими представлениями.

3 голосов
/ 25 февраля 2010
  1. Я использую свой собственный "шаблонный" движок, довольно простые вещи, назначаю value на [key] и сортировку.
  2. Когда я впервые искал шаблонизатор, я нашел его умным, но у него было так много проблем с безопасностью, что я в итоге написал то, что мне было нужно.
  3. Вы спрашиваете, почему? потому что он имеет много функций, которые могут сделать ваше кодирование быстрее (вещи, о которых вы не думали, и вещи, которые вы можете делегировать системе шаблонов вместо кода)
  4. Большинство программистов выбрали систему шаблонов, и при работе в команде необходимо соблюдать стандарт.
3 голосов
/ 25 февраля 2010

С помощью шаблонов вы также можете делегировать ответственность за презентацию дизайнерам. Дизайнеры могут создавать шаблоны, а разработчики могут работать в логике. Также легче поддерживать согласованность презентации.

2 голосов
/ 25 февраля 2010

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

Но если вашим приложениям просто нужен один шаблон и никогда не меняете макет, то придерживайтесь того, что работает для вас, зачем менять? :)

1 голос
/ 29 сентября 2017

Первое обращение к ответам здесь и общий фон:

Основная причина, по которой люди используют их, заключается в том, что они обычно делают вещи немного более краткими. Сомнительно, что это всегда чистая выгода. Увеличенная когнитивная нагрузка изучения нового языка и отсутствие гибкости вашего основного языка может в конечном итоге принести больше недостатка, чем предлагается при использовании языка шаблонов. В частности, Twig требует вручную экспортировать в него основные функции PHP. Лучшим языкам шаблонов, которые стремятся быть краткими, было бы лучше вместо расширения PHP с помощью токенизатора.

Автоматическое экранирование - еще одна сомнительная особенность. Для разработчика, который очень плохо кодирует, автоматическое экранирование может быть более безопасным, но в противном случае это ослабляет безопасность, игнорируя его и предполагая, что по умолчанию все будет безопасно в любом контексте. Действительно безопасный движок шаблонов должен знать много о его контексте, иногда это не всегда можно определить, только программист знает, куда что-то идет. Если вам нужно безопасное программирование, вам нужен разработчик, который не зависит от автоматического экранирования, точка. Это также то, что PHP на самом деле может сделать, если вы токенизируете файл PHP, вы можете отделить необработанный текст от PHP и обернуть части PHP в буферизацию вывода, а затем применить любой фильтр, который вам нравится, так что это не исключительная особенность языка шаблонов.

Некоторые движки шаблонов могут облегчить предварительную генерацию, а предварительную компиляцию - быстрее, но этого можно достичь и с помощью собственных шаблонов. Существует необходимость в разборе шаблонов, что часто делает их менее эффективными и усложняет процесс их использования. Добавленные шаблоны сложности представляют значительный. Это часто можно абстрагировать от вас, но в конечном итоге вы будете раздражать вас, например, проблемы с кэшированием (устаревшие записи), проблемы с производительностью, значительно больше трепетания и беспорядка при отладке, больше слоев и больше кода, требующего гораздо большего, что может пойти не так и т. д.

Многие функции, такие как расширение шаблонов, не требуют использования веток для достижения этой цели. Аналогично для таких вещей, как htmlspecialchars, большинство людей создают короткие вспомогательные функции для всех функций, которые они используют очень часто.

Так где же вам определенно использовать языки шаблонов, такие как Twig?

  1. Присмотр за детьми, плохие разработчики, вроде как действителен, хотя я не уверен, что их следует считать разработчиками, если вам нужно использовать что-то вроде ветки, чтобы попытаться сдержать их. Вы также будете смешивать хороших разработчиков и удивляться, почему их заставляют прыгать через обручи, чтобы достичь простых вещей.

  2. Возможно, вы захотите предоставить шаблоны сторонам, над которыми вы хотите работать с HTML, но не раскрывать внутренние компоненты системы и т. Д. Это может быть, например, в случае, если у вас есть CMS, с пользователями, которые могут редактировать шаблоны но не такие, как ваши разработчики. Это связано с вышеизложенным, но это более реальный случай, когда вы можете получить какую-то выгоду, и это может быть оправдано.

  3. Аналогичный случай, когда вы можете использовать шаблоны между системами, в этом случае язык шаблонов может быть переносимым решением. Это может быть не только там, где у вас есть несколько бэкэндов, но и там, где у вас есть необычные архитектурные требования, такие как серверы, обращенные вперед, отображающие представления из данных, полученных в нисходящем направлении. Продолжайте в том же духе, и вам могут потребоваться шаблоны, которые вы можете визуализировать в интерфейсе или бэкэнде. Если вам нужно только отправить данные во внешний интерфейс, потому что он может отображать представления самостоятельно, это может быть более эффективным. Однако вам также может понадобиться откат к бэкэнду по разным причинам.

  4. Другой случай - статический анализ, в том числе на нескольких языках. Большинство языков шаблонируют эффективно путем конкатенации строк и не знают о языке, который вы создаете. В некоторых случаях язык шаблонов может принести пользу, когда вы сможете полностью его проанализировать, язык и HTML. Еще один способ добиться этого - максимально использовать ваши шаблоны с использованием самого HTML-кода для обозначения вещей, как при использовании классов и т. Д., А также тех средств, которые предоставляет HTML, которые могут позволить вам привязать поведение к вещам. Язык шаблонов также может быть более разборчивым, чем PHP, даже если вы не можете анализировать язык, на котором вы используете шаблоны. Это можно использовать для оптимизации или использования шаблонов, которые легче переносить.

  5. Ваш язык действительно не подходит для создания HTML и других языков. PHP является языком шаблонов, поэтому в большинстве случаев использование языка шаблонов делает мало, но влечет за собой значительные трудности. Однако, если вы используете что-то такое, как Java, вы, скорее всего, захотите использовать движок шаблонов. Языки шаблонов - это DSL, но если у вас уже есть DSL, который делает то, что они делают, то это YAGNI.

  6. Сделанный на заказ шаблон. Где у вас есть определенный формат вывода и домен, который значительно выиграл бы от настроенного языка шаблонов. Это зависит от вашего формата вывода.

Все эти случаи специфичны для конкретной ситуации и недостаточно распространены, чтобы язык шаблонов использовался по умолчанию. Языки шаблонов решают эти проблемы только с разным уровнем успеха (например, многие не знают HTML). Если бы я оценил Twig 10 из 10 за то, как хорошо он справляется, каждый в среднем не был бы далеко 5.

Вы можете конвертировать Twig в PHP, но не PHP в Twig. Иногда это может быть полезно, но это сопряжено со значительными затратами, поскольку вы теряете большую гибкость PHP.

Из небольшого количества внутренних органов Twig, которые я подвергал воздействию качества, также было плохим или импортировало плохие стандарты. Например, синтаксический анализатор не поддерживает или, по крайней мере, не поддерживает сохраняющиеся пробелы, когда я впервые попробовал его пять лет назад. У меня был сценарий, в котором мне нужно было провести рефакторинг, а это означало, что я должен иметь возможность анализировать Twig, изменять и выводить его снова, чтобы переписать код в тысячах шаблонов, Twig не поддерживал его, и мне пришлось самому испортить анализатор.

Точно так же я недавно исследовал побег для Твиг. В частности, выделялось экранирование JS, которое поддерживало экранирование строк JS и других странных вещей, а не просто использование json_encode. Скорее всего, пользовательский экранирование, которое вы получите в фреймворках, неверно. Обычно это более надежно и безопасно делать это самостоятельно (если вы знаете о таких вещах, как то, что происходит, если вы JSON кодируете строку, содержащую и шаблонируете ее как литерал javascript без достаточного экранирования, например).

В большинстве случаев сотни, а иногда и тысячи строк магических шаблонных систем и других связанных с ними систем, используемых для спасения, дезинфекции и т. Д., Являются ужасной практикой, пытаясь угадать ваш сценарий или пытаясь удовлетворить все возможные варианты, добавляя больше возможностей для причудливые ошибки, связанные с повреждением данных, повышающие вероятность грубых ошибок в системе безопасности и т. д. Обычно такие вещи можно найти в инфраструктуре, которая может быть заменена одно- или двухстрочной функцией, которая более безопасна. У вас будут и другие глупости, иногда такие, как обработка чего-либо снова и снова на всякий случай, потому что структура наивна в том, что вы делаете, где, как будто вы делаете вещи сами, вы точно знаете, что делаете, и не делаете тогда есть такие вещи, как санация одной и той же строки снова и снова.

1 голос
/ 20 мая 2011

Я использую шаблонизаторы, когда мне нужна песочница. например, позволяя пользователям размещенной CMS редактировать шаблоны.

1 голос
/ 25 февраля 2010

Ваши не ответы выглядят как реальные ответы, но сформулированы очень снисходительно. Например:

присмотр за плохими разработчиками (т. Е. Используйте шаблонизатор, потому что он заставляет вас не смешивать код в презентации)

Я бы назвал это приложением Правила наименьшей силы . Это делает ваш шаблон намного более полезным для всех пользователей, а не только для «плохих разработчиков».

Ограничения делают языки программирования. В PHP нет функции встроенной сборки, и это не потому, что Расмус думал, что вы все "дети".

1 голос
/ 25 февраля 2010

Некоторые движки шаблонов могут компилировать шаблоны, что приводит к высокооптимизированным преобразованиям. Взять, к примеру, XslCompiledTransform в .NET.

...