Если видео недоступно для просмотра, попробуйте выключить блокировщик рекламы.

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

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

<!-- Можно передать url.../?query=<script>alert('boom!')</script> -->
<!-- При выводе вместо PHP кода подставится тег script который будет выполнен браузером -->
<p><?= $_GET['query'] ?></p>

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

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

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

За время существования PHP были созданы десятки только популярных шаблонизаторов и сотни тех что не взлетели. Со временем они развивались и становились лучше. Когда-то популярный Smarty сейчас уже никто не вспомнит. А вот Blade входящий в состав Laravel знают почти все.

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

Посмотрите на пример простого Blade-шаблона:

<h1>{{ $object->title }}</h1>
<p>{{ $object->description }}</p>
<pre>
    {{ $object->code }}
</pre>
<p>Question submitted at: {{ $object->created_at }}</p>

На первый взгляд похоже. Шаблон выглядит как HTML с вкраплениями кода. В отличии от самого PHP в Blade, вставка любого значения выполняется в двойных фигурных скобках {{ ... }}. Это очень похоже на интерполяцию, если сам шаблон рассматривать как строку. За сценой, Blade выполняет дополнительную обработку и экранирует любые данные, вставленные таким образом. Это значит что нам больше не нужно прилагать усилия к обеспечению безопасности в шаблонах.

Откуда в этом шаблоне взялся $object? Вспомним код обработчика:

<?php

Route::get('/about', function () {
    return view('about');
});

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

<?php

// routes/web.php

Route::get('/about', function () {
    $tags = ['обучение', 'программирование', 'php', 'oop'];
    return view('about', ['tags' => $tags]);
});
<!-- resources/views/about.blade.php -->

<h1>О блоге</h1>
<p>Эксперименты с Ларавелем на Хекслете</p>
<p>{{ implode(', ', $tags) }}</p>

Как видно из примера выше, двойные фигурные скобки позволяют выполнять произвольный PHP код. Главное не злоупотреблять. В основном данные должны быть подготовлены в обработчике до того как они попадут шаблон. Тут стоит сказать отдельно, что PHP, как шаблонизатор, давал слишком много свободы, которая очень влияла на качество кода. При таком использовании PHP, в шаблоне нередко выполнялись SQL-запросы, HTTP-вызовы и тому подобные вещи. По понятным причинам этого делать ни в коем случае нельзя. Шаблоны про отображение, а не про логику работы.

Кроме подстановки, в Blade есть директивы. С их помощью реализованы все управляющие конструкции, такие как циклы, условия и другое:

@if (count($records) === 1)
    I have one record!
@endif

@foreach ($users as $user)
    <p>This is user {{ $user->id }}</p>
@endforeach

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

Blade имеет встроенную поддержку разных элементов, полезных в шаблонах. То что в PHP шаблонах нужно делать "руками", тут есть сразу. К таким возможностям, например, относится определение первой и последней итерации в цикле:

@foreach ($users as $user)
    <!-- $loop специальная переменная доступная внутри цикла -->
    @if ($loop->first)
        This is the first iteration.
    @endif

    @if ($loop->last)
        This is the last iteration.
    @endif

    <p>This is user {{ $user->id }}</p>
@endforeach

Кроме указанных структур, директивы Blade поддерживают цикл for, switch isset и некоторые другие, более специфичные. Часть из них будет рассмотрена дальше, в уроках посвященных макетам и формам.


Дополнительные материалы

  1. Blade
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →