
Не называйте себя разработчиком Laravel, пока не освоите эти 10 концепций.
Если вы здесь, значит, знаете и наверняка используете Laravel. У него элегантный синтаксис и надежный функционал. Но весь ли функционал вам известен?
Будем реалистами: Laravel — это не очередной PHP-фреймворк, а целая экосистема с массой возможностей, где разработчики запросто создают все — от небольших проектов до приложений корпоративного уровня. Как же задействовать эти возможности по максимуму?
Laravel — это не только настройка маршрутов и шаблоны Blade, а нечто гораздо большее. Освоив его обширный функционал и концепции, можно неслабо прокачать свои навыки разработки. От обычных пользователей настоящие разработчики Laravel отличаются умением применять этот функционал — они-то знают, как заставить фреймворк танцевать.
Благодаря пониманию ключевых концепций они создают приложения более оптимальными, а код более эффективным, сопровождаемым и масштабируемым. С этими концепциями работа в Laravel — одно удовольствие.
Изучим 10 важнейших концепций и необходимый функционал Laravel в порядке возрастания сложности.
Если к концу статьи вы научитесь корректно их применять, сможете с гордостью именоваться разработчиком Laravel.
1. Основы маршрутизации и продвинутые техники
Для Laravel маршрутизация — это как GPS. При вводе пользователем URL-адреса приложению сообщается, куда перейти. Казалось бы, все просто. Но это только на первый взгляд.
Базовая маршрутизация
Допустим, у вас имеется простенькая веб-страница с приветственной надписью Welcome to Laravel! Вот как она настраивается:
Route::get('/welcome', function () {
return 'Welcome to Laravel!';
});
Этим маршрутом прослушивается запрос GET
к /welcome
и получается приветствие — все равно, что указать кому-то дорогу к дому и с улыбкой открыть дверь.
Группы маршрутов
Теперь представим несколько страниц, доступных только для зарегистрированных пользователей, например дашборд и страница настроек. Вместо того, чтобы для каждого маршрута отдельно прописывать промежуточное ПО auth
, объединим их:
Route::middleware(['auth'])->group(function () {
Route::get('/dashboard', function () {
return 'Welcome to your dashboard!';
});
Route::get('/settings', function () {
return 'Here are your settings.';
});
});
Это как настройка VIP-раздела приложения, куда входят только аутентифицированные пользователи.
Привязка моделей маршрутов
Здесь уже интереснее. В Laravel нужные данные извлекаются автоматически по URL-адресу. Чтобы показать страницу пользователя при посещении им example.com/user/1
, не нужно писать запросы к базе данных — вся тяжелая работа выполняется за вас Laravel:
Route::get('/user/{user}', function (App\Models\User $user) {
return $user->name;
});
Вот так запросто в Laravel из базы данных извлекается пользователь с идентификатором 1
и показывается его имя. Это как если бы дворецкий точно назвал имя гостя, который стучится в вашу дверь.
2. Шаблонизатор Blade
Blade — это механизм обработки шаблонов Laravel, благодаря которому представления — то, что видят пользователи, — становятся динамичными и интерактивными. Это как палитра для раскрашивания красивых веб-страниц.
Базовый синтаксис Blade
Вот простой шаблон Blade с приветственным обращением к пользователю по имени:
<!DOCTYPE html>
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Hello, {{ $name }}!</h1>
</body>
</html>
Директива {{ $name }}
похожа на заполнитель: здесь вводится фактическое имя пользователя, как при обращении в письме.
Директивы Blade
В Blade имеются удобные синтаксические конструкции для типичных задач.
Операторы If:
@if($user->isAdmin())
<p>Welcome, admin!</p>
@else
<p>Welcome, user!</p>
@endif
Похож на оператор if-else
в PHP, только четче и удобнее для восприятия.
Циклы:
@foreach($users as $user)
<p>{{ $user->name }}</p>
@endforeach
Этим циклом проходится каждый пользователь и выводится соответствующее имя. Напоминает раздачу бейджиков на вечеринке — каждый получает по одному.
Компоненты: из них создаются многоразовые элементы пользовательского интерфейса, такие как кнопки или оповещения:
<x-alert type="danger" message="Something went wrong!" />
Теперь, когда что-то пойдет не так, этим компонентом отобразится предупреждение.
3. Аутентификация и авторизация
Безопасность приложения важна, на Laravel она обеспечивается очень легко. При аутентификации узнается, кем пользователь является, а при авторизации — что ему разрешено.
Встроенная аутентификация
В Laravel имеется встроенная система аутентификации, которая настраивается за считанные минуты и доступна обычно через фасады Auth
и Session
. А также — для управления токенами API и аутентификации отправляемых ими запросов — два дополнительных пакета: Passport и Sanctum.
Авторизация: шлюзы и политики
Для контроля разрешенных пользователям действий в Laravel имеются шлюзы и политики. Шлюзы — это как простые замки на дверях, а политики — более сложные правила, настраиваемые для каждой комнаты.
Шлюзы:
Gate::define('edit-settings', function ($user) {
return $user->isAdmin();
});
Здесь настройки редактируются только администраторами. Это все равно, что отдать ключи от диспетчерской ограниченному числу ответственных лиц.
Политики:
Логика авторизации группируется политиками по модели. Например, при помощи PostPolicy
определяется, кто может обновлять статью в блоге:
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
Редактирует статью только автор — это просто и безопасно. Регистрируем эту политику в AuthServiceProvider
, и готово.
Авторизация управляется также ролями и разрешениями.
4. Освоение Eloquent ORM
Благодаря Eloquent взаимодействие с базой данных на Laravel превращается в волшебство. Причем объектно-ориентированное, и без сложных SQL-запросов.
Базовое использование Eloquent
Допустим, нужно получить всех пользователей базы данных. С Eloquent это просто:
$users = App\Models\User::all();
Так получается коллекция со всеми пользователями базы данных — все равно что ролодекс со всеми контактами.
Взаимосвязи
Реальные приложения — это не только отдельные записи, но и их взаимосвязи. С Eloquent обработка этих взаимосвязей упрощается:
Один к одному. Это как человек и его паспорт: один человек — один паспорт:
public function phone()
{
return $this->hasOne(Phone::class);
}
Один ко многим. Как блог со статьями: один блог — много статей:
public function posts()
{
return $this->hasMany(Post::class);
}
- Многие ко многим. Как студенты и лекции: студенты посещают много лекций:
public function roles()
{
return $this->belongsToMany(Role::class);
}
Безотложная загрузка
Иногда одномоментная выборка связанных данных чревата замедлением. Безотложная загрузка — это как если сказать серверу: «Принеси мне все и сразу», и никакого ожидания:
$users = App\Models\User::with('posts')->get();
5. Контейнер внедрения зависимостей
Контейнер внедрения зависимостей Laravel аналогичен конструктору Lego, зависимости классов здесь управляются за вас.
Внедрение зависимостей
Внедрение зависимостей — это когда нужные классу компоненты не создаются им самим, а получаются извне. Это как при сборке автомобиля: двигатель не производится на месте, а предоставляется уже готовый.
Вот как в контроллер внедряется платежный сервис:
public function __construct(PaymentGateway $paymentGateway)
{
$this->paymentGateway = $paymentGateway;
}
public function registerUser(UserService $userService)
{
$user = $userService->create(request()->all());
}
В этом примере сообщаем Laravel, что нужен PaymentGateway
, который нам и предоставляется — легко и просто. Здесь же вызывается UserService
и используются его методы.
Привязка контейнера внедрения зависимостей
Зависимости в Laravel разрешаются привязками:
$this->app->bind(PaymentGateway::class, StripePaymentGateway::class);
Теперь при запрашивании PaymentGateway
в Laravel выдается экземпляр StripePaymentGateway
.
6. Жизненный цикл запросов и промежуточный слой
Промежуточный слой представляется чем-то вроде колбасы между двумя ломтями хлеба, в Laravel же он связан с фильтрацией HTTP-запросов.
Создание промежуточного слоя
Промежуточный слой — это как фейс-контроль в ночном клубе: запрос им проверяется на входе в приложение:
php artisan make:middleware CheckAge
Вот как устроен этот вышибала CheckAge
:
public function handle(Request $request, Closure $next)
{
if ($request->age <= 18) {
return redirect('home');
}
return $next($request);
}
Лицам до 18 вход здесь воспрещен, они отправляются промежуточным слоем домой.
Промежуточный слой и маршруты
Приспособим вышибалу к конкретным маршрутам:
Route::get('/restricted', function () {
return 'Welcome to the restricted section!';
})->middleware('checkAge');
Теперь доступ к /restricted
получается после проверки возраста. Так контролируется, кто допускается, а кто нет.
Но это не все, сценариев применения промежуточного слоя много:
аутентификация, авторизация, логирование, мониторинг производительности, ограничение скорости, режим обслуживания, локализация, пользовательские заголовки, внесение IP в белый/черный списки и т. д.
7. Событийно-ориентированная архитектура
События в Laravel подобны звонкам уведомлений в любимых приложениях — когда случается что-то важное, ими об этом сообщается различным частям приложения.
Создание и прослушивание событий
Чтобы при регистрации каждого нового пользователя отправлять приветственное сообщение, сначала создается событие:
php artisan make:event UserRegistered
Затем прослушиватель, которым это событие обрабатывается:
php artisan make:listener SendWelcomeEmail
В EventServiceProvider
Laravel указывается запускать прослушиватель при возникновении события:
protected $listen = [
UserRegistered::class => [
SendWelcomeEmail::class,
],
];
Теперь при регистрации пользователь получает приветственное сообщение. Это как настройка автоматического напоминания о дне рождения — забыть поздравить с этим радостным событием больше не получится.
8. Тестирование
Тестирование — это как репетиция перед большим выступлением. И, когда поднимется занавес, все должно пройти гладко.
Модульное тестирование
Модульными тестами тестируются небольшие части приложения: отдельные методы или классы. Написание и запуск этих тестов с Laravel упрощаются:
php artisan make:test UserTest
В тесте проверяется, возвращается ли методом ожидаемый результат:
public function test_user_creation()
{
$user = User::factory()->create();
$this->assertEquals('John Doe', $user->name);
}
Тесты запускаются просто:
php artisan test
Тестирование функционала
В тестах функционала проверяется совместная работа различных частей приложения, например как системой входа обрабатывается попытка авторизации пользователя:
public function test_login()
{
$response = $this->post('/login', [
'email' => '[email protected]',
'password' => 'secret',
]);
$response->assertRedirect('/home');
}
Эти тесты подобны прогону всего процесса в том или ином функционале для проверки корректности их работы. Благодаря тестированию вы избавитесь от лишней нервотрепки, в Laravel оно проводится с PHPUnit или PEST.
9. Очереди и фоновые задания
Иногда на выполнение задач, например отправки электронных писем тысячам пользователей или обработки больших файлов, требуется время. Чтобы не заставлять пользователей ждать, эти задачи делаются фоновыми.
Настройка очередей
Очереди — это что-то вроде списка задач для приложения. В Laravel предоставляется несколько драйверов очередей на выбор: Redis, Beanstalkd или даже база данных.
Вот как создается новое задание:
php artisan make:job ProcessPodcast
Внутри задания определяется, что нужно сделать:
public function handle()
{
// Подкаст обрабатывается...
}
Теперь, когда приложению нужно обработать подкаст, это задание отправляется в очередь:
ProcessPodcast::dispatch();
Обо всем остальном позаботится Laravel, обрабатывая подкаст в фоновом режиме, пока пользователи продолжают просматривать сайт.
Очень удобно, например, для обработки платежей, отправки электронных писем, пакетных обновлений, обработки файлов.
10. Команды Artisan
Наконец, добрались до секретного оружия Laravel — интерфейса командной строки Artisan с инструментами для создания приложений и управления ими.
Базовые команды
Вы уже видели такие команды Artisan, как make:model
и make:controller
. Имеются и другие:
php artisan optimize:clear // для очистки кешей в представлении, конфигурации, событиях и т. д.
php artisan optimize // для кеширования всего, что кешируется
Tinker
Tinker — это интерактивная среда для экспериментирования с приложением Laravel: взаимодействия с моделями, запуска запросов и испытания фрагментов кода — и все это из командной строки.
php artisan tinker
Упорядоченный список всех доступных команд Artisan в Laravel — как встроенных, так и любых созданных пользовательских команд — выводится такой командой терминала:
php artisan list
Создание пользовательских команд
Для чего-то поконкретнее, например отправки напоминаний пользователям с просроченнойй подпиской, создаются собственные команды Artisan:
php artisan make:command SendReminderEmails
Определение названия команды: в сгенерированном командном файле app/Console/Commands/SendReminderEmails.php
определяем свойство signature
, это название команды в терминале:
protected $signature = 'emails:send-reminders';
Чтобы запустить пользовательскую команду, используем в терминале такой синтаксис:
php artisan emails:send-reminders
Так выполнится логика, определенная в методе handle()
пользовательской команды.
Заключение
Освоение Laravel — это знание не только основ, но и нюансов его мощного функционала, а также умение эффективно их использовать. 10 рассмотренных выше концепций необходимы для становления компетентного разработчика Laravel. Ими формируется каркас этого инструмента для создания веб-приложений — от небольших проектов до сложных систем.
Но Laravel — это еще и обширная экосистема со множеством других важных концепций и инструментов для оттачивания навыков разработки. Например, шифрованием Laravel легко защитить конфиденциальные данные, обеспечить соответствие приложения рекомендациям безопасности. Планированием задач для автоматизации повторно выполняемых задач, а также локализацией охватывается глобальная аудитория за счет простой мультиязыковой поддержки, запросами форм упрощается логика проверки, контроллеры остаются чистыми и акцентированными, широковещанием приложениям предоставляются возможности режима реального времени, и не забывайте о файловом хранилище — им обеспечивает гибкость хранения файлов в различных драйверах с единым API: локальных, S3 и других.
Если вы имеете дело с API, ресурсы API и преобразователи незаменимы для преобразования данных в хорошо структурированные и согласованные ответы API.
Продолжение освоения Laravel — это постоянное изучение нового функционала, отслеживание обновлений, экспериментирование с инструментами и пакетами. Чем больше погружаешься в Laravel, тем больше узнаешь, как создавать приложения — не только функциональные, но и элегантные, сопровождаемые, эффективные и красивые.
Читайте также:
- Eloquent: 40 методов ORM для разработчиков Laravel
- Как интегрировать уведомления в реальном времени с Laravel и Pusher
- Полное руководство по кэшированию Laravel
Читайте нас в Telegram, VK и Дзен
Перевод статьи Chimeremze Prevail Ejimadu: You’re Not a Laravel Developer If You Don’t Know These 10 Things