как лучше использовать Smarty с PHP?

Я обнаружил, что при использовании Smarty с PHP иногда требуется дополнительное время для

1) используется совершенно другой синтаксис, чем сам PHP
2) необходимо проверять небольшие случаи, поскольку в документации нет более подробных сведений, таких как "экранирование"

http://www.smarty.net/manual/en/language.modifier.escape.php

он не говорит escape: «кавычки» предназначены только для двойных кавычек или для одинарных кавычек, поэтому вам нужно написать код для его проверки. Также для случая экранирования: «javascript» — не могу точно сказать, что и как экранировано.

3) для чего-то сложного нужно написать вспомогательные функции или модификаторы, поэтому нужно создать новые файлы и снова сделать это на PHP.

Кстати, дает ли использование Smarty хорошее ускорение по сравнению с использованием только PHP? благодаря.


person nonopolarity    schedule 17.05.2009    source источник


Ответы (11)


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

Единственный «настоящий» аргумент, который я когда-либо слышал в пользу использования ЛЮБОГО механизма шаблонов, заключался в том, что они предоставляют более простой язык для манипулирования шаблонами, что может быть удобно, если у вас есть дизайнеры шаблонов, которые не знают PHP и которым вы не доверяете. научиться разумно использовать PHP.

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

<? foreach($array as $key => $val): ?>
    <?= $val ?>
<? endforeach; ?>

VS:

<?php
    foreach($array as $key => $val) {
        echo $val;
    }

?>

Лично я считаю, что шаблонизаторы появились в PHP, потому что:

  1. Так делают другие языки
  2. Опытные PHP-программисты поняли, что им нужен способ обеспечить разделение между представлением и логикой приложения, и шаблоны были простым способом сделать это.

Первая причина просто глупая. Вторую причину можно преодолеть при небольшом самоконтроле и даже элементарном понимании необходимости разделения слоев в приложении. Шаблон проектирования MVC является одним из способов решения этой проблемы. Что касается осуществления некоторого самоконтроля, мое правило состоит в том, что используются только необходимые циклы и операторы if, а также функции, которые фильтруют, экранируют, форматируют вывод для экрана.

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

person Noah Goodrich    schedule 17.05.2009
comment
+1 за правду. Кстати: у вас есть ошибка в вашем коде: $val++ должен быть эхом $val, чтобы соответствовать первому примеру кода. - person Residuum; 01.09.2009
comment
Тем не менее, они добавили теги {PHP}{/PHP}, чтобы я мог выполнять все свои запросы к базе данных там;) - person SeanJA; 13.04.2010
comment
Только вы забыли упомянуть, что вы не можете полагаться на короткий синтаксис, так как его вполне можно отключить. Так что, если вы разрабатываете серьезный проект, который работает не только на вашей машине, вам придется залить свою страницу <?php echo $var ?>. Теперь это не выглядит так сексуально по сравнению с {$val}, не так ли? - person serg; 19.09.2010

Я не люблю шаблонизаторы. Я нахожу их очень ресурсоемкими и с потерями для PHP.

В MediaWiki, начиная с версии 1.6.x, мы отказались от использования Smarty по умолчанию и просто использовали встроенные шаблоны PHP, что значительно улучшило производительность.

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

Laconica, открытая платформа микроблогов, по умолчанию не использует шаблоны. У нас есть плагин для людей, которые без ума от шаблонов.

person Evan P.    schedule 17.05.2009

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

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

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

Производительность — еще одно соображение. Да, рендеринг шаблона Smarty требует затрат. Но после того, как это будет сделано, вывод должен быть кэширован, что приведет к сокращению времени выполнения. То же самое касается шаблонов PHP. PHP позволяет реализовать все виды гранулярных моделей кэширования за счет использования своих выходных буферов. Но остерегайтесь преждевременной оптимизации: делайте это только после того, как закончите код и определите узкие места!

Самые большие затраты при использовании Smarty или любого другого движка приходятся на время разработчика. Это еще один уровень сложности, и вы неизбежно окажетесь в ситуациях, когда вам придется обмануть движок, чтобы он делал то, что вы могли бы сделать на чистом PHP.

person Udo    schedule 17.05.2009

Мне нравятся механизмы шаблонов, и я думаю, что их следует использовать, но в конкретном случае Smarty я думаю, что это пустая трата времени, потому что это не является значительным улучшением по сравнению с PHP как языком шаблонов:

  • Новый синтаксис по-прежнему основан на старой концепции специальных тегов, вставленных в произвольные места документа.
  • Поскольку Smarty не понимает синтаксиса/структуры HTML, он не может не помочь вам создать корректный/правильный HTML. Теги Smarty нарушают синтаксис HTML, поэтому, как только вы их добавите, другие стандартные инструменты также не смогут вам помочь.
  • Вывод Smarty, как и в PHP, по умолчанию является небезопасным (неэкранированным), и вам необходимо не забывать добавлять |escape везде, где вы выводите данные в HTML.

Я влюбился в один механизм шаблонов PHP, который решает все эти проблемы: PHPTAL.

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

PHPTAL, как и Smarty, один раз компилируется в PHP и кэшируется, поэтому производительность сравнима с необработанным PHP.

person Kornel    schedule 17.05.2009
comment
Единственное, что мне нравилось в smarty, это фильтры для автоматического экранирования вывода. Вы не найдете этого во многих других системах. - person I.devries; 16.06.2009
comment
@Vatos: ИМХО, это недостаток, потому что вы должны использовать этот фильтр. Если вы забудете, ваш вывод будет небезопасным/недействительным. Правильная система шаблонов должна автоматически экранироваться автоматически без специального фильтра. - person Kornel; 16.06.2009

Плюсы

  • Нет PHP в ваших HTML-файлах (позволяет идентифицировать как PHP, так и HTML)
  • Каналы {$var|по умолчанию: "Ничего не выбрано"} {$var|urlencode}
  • Foreachelse: {foreach item=row from=$results}{$row.name}‹br›{foreachelse}Нет результатов{/foreach}
  • Тематические веб-сайты/страницы (использование только CSS имеет свои ограничения)

Минусы

  • Синтаксис другого языка
  • Не всегда очевидный код {"Y-m-d"|strftime:$timestamp} {$array|@var_dump}
  • Небольшие накладные расходы

Я настоятельно рекомендую «шаблонный» подход (mVc), но и Smarty, и обычный PHP подходят для этой задачи.

person Bob Fanger    schedule 18.05.2009

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

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

person Dasha Salo    schedule 17.05.2009

Лично я использую Blitz для создания шаблонов. На сайте автор утверждает, что это самый быстрый механизм шаблонов, и предоставляет (предвзятую?) диаграмму производительности между различными системами шаблонов для PHP. Я сам не использовал smarty, но это может дать вам некоторые подсказки о его производительности.

http://alexeyrybak.com/blitz/blitz_en.html

person runfalk    schedule 17.05.2009

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

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

Если вы уверены в своей способности разделить реализацию и представление и не имеете реального интереса к кэшированию на стороне сервера, вам, вероятно, следует просто использовать чистые шаблоны php. Некоторые платформы MVC, такие как Zend Framework, имеют свои собственные системы шаблонов, подобные PHP.

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

Тем не менее, я использую Smarty в большинстве своих PHP-проектов, так как он напоминает мне библиотеки тегов Java-Server (JSTL), к которым я очень, очень привык и люблю.

person karim79    schedule 17.05.2009

Использовать Smarty или нет — это более или менее философская позиция.

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

Кроме того, расширить Smarty довольно просто.

В качестве примера я добавил параметр стилей в fetch(), чтобы получить fetchUsingStyle(). Это позволяет мне довольно легко переключаться между различными макетами сайта.

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

person SteAp    schedule 16.02.2011

Попробуйте использовать Smarty с шаблоном MVC, таким как Codeigniter, это лучше, чем основной PHP

person senthilbp    schedule 09.10.2012

Зачем использовать механизм шаблонов, когда вы можете просто использовать свои html-файлы и вставлять php-код там, где вам это нужно? Вы можете сделать это с помощью Psttt! движок шаблонов для php

полный исходный код здесь http://github.com/givanz/psttt

person codeassembly    schedule 19.09.2010