Источник

Не называйте себя разработчиком 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, тем больше узнаешь, как создавать приложения  —  не только функциональные, но и элегантные, сопровождаемые, эффективные и красивые.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Chimeremze Prevail Ejimadu: You’re Not a Laravel Developer If You Don’t Know These 10 Things

Предыдущая статьяПолезные рабочие плагины TMUX
Следующая статьяC# —  создаем клиент-серверный чат на TCP