Мы знаем из курса по веб-разработке, что 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 и некоторые другие, более специфичные. Часть из них будет рассмотрена дальше, в уроках посвященных макетам и формам.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.