Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Шаблонизатор Blade

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

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

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

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

Для полного доступа к курсу нужна профессиональная подписка

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

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

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

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Отправляя форму, вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».

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

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

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

Отправляя форму, вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».