Статьи

Взлеты и падения двигателей шаблонов PHP

Механизм шаблонов PHP — это способ вывода PHP в ваш HTML без использования синтаксиса PHP или тегов PHP. Предполагается, что он будет использоваться при наличии класса PHP, который будет отправлять вашему HTML переменные, которые вы хотите отобразить, а HTML просто отображает эти данные. Это означает, что вы вынуждены отделить свою логику PHP от вывода HTML, и это здорово; разделение в вашем коде — это то, к чему вы должны стремиться.

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

<?php
    $title = 'Product Page';
    $products = $productModal->getAllProducts();
?>
<h1><?php echo $title; ?></h1>

<div class="products">
    <?php
        if(empty($products))
        {
            echo 'No products exist';
        } else {
            foreach($products as $product)
            {
                ?>
                    <h2><?php echo $product->title; ?></h2>
                    <p><?php echo $product->description; ?></p>
                <?php
            }
        }
    ?>
</div>

Идея использования механизма шаблонов состоит в том, что вы удалили бы переменную $ title и переменную $ products и поместили ее в класс, а затем вызвали файл шаблона для отображения HTML.

<?php

class Display_Products
{
    public function indexAction()
    {
        $vars = array();

        $vars['title'] = 'Products';
        $vars['products'] = $productModal->getAllProducts();

        $this->renderHtml('all-products.html', $vars);
    }
}
?>

Метод renderHtml () передает переменные, которые вы хотите отобразить, в файл шаблона, который будет выглядеть примерно так.

<h1>{{ title }}</h1>

<div class="products">
    {% for product in products %}
        <h2>{{ product.title }}</h2>
        <p>{{ product.description }}</p>
    {% else %}
        No products exist.
    {% endfor %}
</div>

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

Какие фреймворки в настоящее время используют шаблоны?

Есть несколько больших фреймворков, которые в настоящее время используют шаблонизатор. Некоторые из них, которые я использовал, это Laravel , Drupal 8 и Expression Engine . Все они используют разные механизмы шаблонов, но понимание того, как они работают, одинаково.

Laravel — Лезвие Шаблонирование

Laravel использует шаблонизатор Blade . Вот пример того, как вы будете использовать blade-сервер в ваших HTML-представлениях.

<!-- Stored in app/views/layouts/master.blade.php -->

<html>
    <body>
        @section('sidebar')
            This is the master sidebar.
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

Вывести переменную

{{ $val }}

Цикл по каждому элементу

@foreach ($users as $user)
 <div class="user">{{ $user->name }}</div>
@endforeach

If / else Заявление

@if ($user->name == 'Dave')
 <p>Welcome Dave!</p>
@else
 <p>Welcome Guest!</p>
@endif

Шаблон для клинков

Drupal — Twig

Drupal CMS использует шаблонизатор Twig . Это было разработано, чтобы сделать шаблоны быстрее и безопаснее. Он работает так же, как blade-сервер, но синтаксис немного отличается.

Вывести переменную

{{ var }}

Для петли

{% for user in users %}
    * {{ user.name }}
{% else %}
    No user have been found.
{% endfor %}

Наследовать шаблоны

{% extends "layout.html" %}

{% block content %}
    Content of the page...
{% endblock %}

прут

всезнайка

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

Вывести переменную

{$name}

Цикл по каждому элементу

{foreach $users as $user}
{strip}
   <tr bgcolor="{cycle values="#aaaaaa,#bbbbbb"}">
      <td>{$user.name}</td>
      <td>{$user.phone}</td>
   </tr>
{/strip}
{/foreach}

Если заявление

{if $name == 'Fred'}
    Welcome Sir.
{elseif $name == 'Wilma'}
    Welcome Ma'am.
{else}
    Welcome, whatever you are.
{/if}

всезнайка

Использование шаблонизатора

Три примера шаблонизаторов, которые я привел выше, не являются единственными доступными шаблонизаторами. Их много, и не только для PHP. Многие другие языки могут использовать шаблонизатор. Несмотря на то, что это разные двигатели, все они в некотором роде похожи; все они были разработаны для того, чтобы интерфейсные шаблоны быстрее и легче читались. Все они отмечают, что это вызывает разделение вашего кода и облегчает чтение HTML, потому что в вашем HTML нет тегов PHP.

Но когда я работаю с этими разными движками, мне никогда не нравится развиваться с ними. Я на самом деле обнаружил, что они резко замедляют мою разработку, потому что теперь мне нужно искать синтаксис Smarty или синтаксис Twig для того, что я хочу сделать.

То, что они упоминают о разделении кода, совершенно верно; у вас не должно быть логики в вашем HTML. Однако вам не нужна система шаблонов для этого. В предыдущем уроке я продемонстрировал, как вы можете отделить ваш HTML от кода простым способом, используя буферизацию вывода .

Отделить HTML от кода

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

Я также не согласен с тем, что упомянуто о том, что движки шаблонов легче читать. Возьмите foreach in blade для примера разницы:

<!-- PHP foreach -->
<?php
foreach ($users as $user)
{
    ?>
    <div class="user"><?php echo $user->name; ?></div>
    <?php
}
?>
<!-- Blade foreach -->
@foreach ($users as $user)
 <div class="user">{{ $user->name }}</div>
@endforeach

Между этими примерами кода нет большой разницы, за исключением того, что вы используете Blade:

{{ $user->name }}

В PHP, с другой стороны, вы используете:

<?php echo $user->name; ?>

Я даже заставил PHP делать больше, чем нужно. Я мог бы просто использовать
функцию printf () для вывода div, поэтому это выглядело бы так:

<!-- PHP foreach -->
<?php
foreach ($users as $user)
{
    printf('<div class="user">%s</div>', $user->name);
}
?>

Неужели так сложно читать, что нам нужно выучить совершенно новый язык шаблонов для вывода переменных в вашем HTML? Я так не думаю.

Преимущество использования шаблонизатора

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

Итак, я задал этот вопрос в Google+: в чем выгода или использование шаблонизатора? Один из ответов, которые я направил мне в этот пост на stackoverflow, объясняет некоторые преимущества использования шаблонизатора .

Некоторые из упомянутых преимуществ:

  • Новый синтаксис
  • Автоматический выход
  • Наследование шаблонов
  • Легкость чтения для не-разработчиков

Теперь я бы сказал, что изучение нового синтаксиса не является преимуществом. Необходимость искать правильный синтаксис каждый раз, когда мне нужно выполнить цикл foreach или оператор if, будет занимать гораздо больше времени, чем простое использование PHP.

Автоматическое побег является реальным преимуществом. Поэтому многие разработчики забывают убегать при выводе контента на страницу, и это позаботится об этом за вас. Но на самом деле не так сложно создать функцию, которая будет экранировать содержимое переменной. Если вам нужны хорошие примеры, в WordPress есть файл форматирования (/wp-includes/formatting.php) с множеством экранирующих функций, которые вы можете использовать в различных ситуациях. Затем убедитесь, что вы удалили свой контент, прежде чем отправлять его на просмотр.

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

Простота чтения для тех, кто не является разработчиком, — это то, с чем я больше не согласен. PHP не сложный язык для чтения. Это даже не сложный язык для изучения. Если у вас есть сторонний разработчик, который меняет ваш HTML и не может понять, что вы делаете с PHP, то я бы порекомендовал им пойти и изучить основы PHP. Я не говорю, что им нужно узнать, как все работает и принципы ООП, а просто основы, чтобы они могли определить, что такое оператор if, что такое цикл for и так далее. Собственный синтаксис PHP ничем не отличается от синтаксиса механизма шаблонов, поэтому, если они могут это узнать, то они наверняка смогут изучить синтаксис PHP.

Для меня единственным реальным преимуществом использования шаблонизатора является безопасность и автоматическое удаление выходных данных HTML.

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

Вот хорошая статья по причинам, по которым вы должны использовать движки шаблонов: Шаблонные движки в PHP .

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