Зарегистрируйтесь, чтобы продолжить обучение

Шаблонизатор Blade PHP: Разработка на Laravel

Мы знаем из курса по веб-разработке, что 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, знают почти все.

Это на самом деле важно, потому что до сих пор огромное число сайтов и CMS используют встроенную шаблонизацию 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>Эксперименты с Laravel на Хекслете</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

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»