Сегодня расскажу про одну из самых частых болей в любом проекте на Laravel — отладку запросов с Eloquent и N+1 проблемой.
Ты наверняка сталкивался с ситуацией: всё работает, но чуть-чуть замедляется. Начинаешь копать и видишь кучу повторяющихся SQL-запросов. Это классическая N+1 проблема — когда вместо одного запроса Laravel делает десятки.
👀 Как это проявляется?
У тебя есть, например, список постов и у каждого поста автор:
Laravel выполнит 1 запрос на посты и N запросов на пользователей. А должен был бы — 2 запроса максимум.
🛠 Решение простое — eager loading:
Теперь Laravel сначала загрузит всех постов, а потом сразу всех юзеров одним вторым запросом.
📦 Но как быстро выявить такие ошибки?
Используй Laravel Debugbar или Clockwork. Они наглядно показывают все SQL-запросы и сразу виден N+1.
Ещё один вариант — в проде подключить Laravel Telescope, если это безопасно, или поставить простую логику, которая логирует количество SQL-запросов на каждый HTTP-запрос.
⚠️ Совет: всегда используй
👉 @php_lib
Ты наверняка сталкивался с ситуацией: всё работает, но чуть-чуть замедляется. Начинаешь копать и видишь кучу повторяющихся SQL-запросов. Это классическая N+1 проблема — когда вместо одного запроса Laravel делает десятки.
👀 Как это проявляется?
У тебя есть, например, список постов и у каждого поста автор:
$posts = Post::all();
foreach ($posts as $post) {
echo $post->user->name;
}
Laravel выполнит 1 запрос на посты и N запросов на пользователей. А должен был бы — 2 запроса максимум.
🛠 Решение простое — eager loading:
$posts = Post::with('user')->get();
Теперь Laravel сначала загрузит всех постов, а потом сразу всех юзеров одним вторым запросом.
📦 Но как быстро выявить такие ошибки?
Используй Laravel Debugbar или Clockwork. Они наглядно показывают все SQL-запросы и сразу виден N+1.
Ещё один вариант — в проде подключить Laravel Telescope, если это безопасно, или поставить простую логику, которая логирует количество SQL-запросов на каждый HTTP-запрос.
⚠️ Совет: всегда используй
with()
при выборке данных для списков, особенно если в шаблоне дергаешь связанные модели.👉 @php_lib
👍5
Сегодня я расскажу вам о том, как настроить эффективное логирование ошибок в PHP-приложениях с помощью библиотеки Monolog.
В повседневной разработке критично не упустить важные ошибки и события, но при этом не завалить логи мусором. Monolog позволяет:
1. Группировать логи по каналам
Вы можете создавать каналы для разных частей приложения:
2. Использовать разные обработчики (handlers)
Отправка ошибок в файлы, на почту или в Slack:
3. Добавлять процессоры (processors)
Автоматически дополнять каждый лог юзер-агентом, IP и временем выполнения:
4. Форматировать вывод
Пример простого форматера:
🎯 Совет на практике: заведите отдельные файлы логов под разные уровни важности (INFO, WARNING, ERROR), чтобы при поиске нужных записей достаточно было открыть один файл.
❓ А как вы организуете логи в своих проектах? Делитесь опытом в комментариях!
👉 @php_lib
В повседневной разработке критично не упустить важные ошибки и события, но при этом не завалить логи мусором. Monolog позволяет:
1. Группировать логи по каналам
Вы можете создавать каналы для разных частей приложения:
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$dbLogger = new Logger('database');
$dbLogger->pushHandler(new StreamHandler(__DIR__.'/logs/db.log', Logger::WARNING));
2. Использовать разные обработчики (handlers)
Отправка ошибок в файлы, на почту или в Slack:
use Monolog\Handler\NativeMailerHandler;
$emailHandler = new NativeMailerHandler('you@domain.com', 'DB Error', 'app@domain.com', Logger::ERROR);
$dbLogger->pushHandler($emailHandler);
3. Добавлять процессоры (processors)
Автоматически дополнять каждый лог юзер-агентом, IP и временем выполнения:
use Monolog\Processor\WebProcessor;
$dbLogger->pushProcessor(new WebProcessor());
4. Форматировать вывод
Пример простого форматера:
use Monolog\Formatter\LineFormatter;
$formatter = new LineFormatter("[%datetime%] %channel%.%level_name%: %message% %context%\n");
$handler->setFormatter($formatter);
🎯 Совет на практике: заведите отдельные файлы логов под разные уровни важности (INFO, WARNING, ERROR), чтобы при поиске нужных записей достаточно было открыть один файл.
❓ А как вы организуете логи в своих проектах? Делитесь опытом в комментариях!
👉 @php_lib
👍5❤1👎1
🚀 Открой для себя идеальный путь к лидерству с карьерным тестом от ОЭЗ «Алабуга»! 🌟
Мечтаете о карьере в крупной компании, где ваш потенциал раскроется на полную? Наш тест поможет вам определить вашу уникальную лидерскую роль. Может быть, именно вы станете тем лидером, который выведет команду на новый уровень?
После прохождения теста вы можете заполнить заявку и получить приглашение на эксклюзивную лидерскую программу. Участие в программе открывает реальные перспективы трудоустройства в ОЭЗ «Алабуга», предоставляя шанс начать путь к профессиональному признанию.
Сделайте первый шаг к своему будущему сегодня! Пройдите тест, подайте заявку и начните строить свою карьеру вместе с нами. 🎯
Мечтаете о карьере в крупной компании, где ваш потенциал раскроется на полную? Наш тест поможет вам определить вашу уникальную лидерскую роль. Может быть, именно вы станете тем лидером, который выведет команду на новый уровень?
После прохождения теста вы можете заполнить заявку и получить приглашение на эксклюзивную лидерскую программу. Участие в программе открывает реальные перспективы трудоустройства в ОЭЗ «Алабуга», предоставляя шанс начать путь к профессиональному признанию.
Сделайте первый шаг к своему будущему сегодня! Пройдите тест, подайте заявку и начните строить свою карьеру вместе с нами. 🎯
⚡1🔥1🍾1
Сегодня расскажу вам про одну простую, но очень полезную привычку для любого PHP-разработчика — вести чек-листы по задачам прямо в коде.
Когда проект становится чуть больше "визитки", начинают скапливаться мелкие задачи: что-то подправить, где-то доделать, что-то не забыть протестировать. В итоге куча мыслей крутится в голове, а шанс что-то упустить растёт. Как я с этим борюсь?
Я просто добавляю короткие TODO-комментарии в нужных местах кода. Например:
Каждый раз перед коммитом быстро пробегаюсь по проекту поиском по "TODO" — и вижу все свои маленькие хвосты. А когда задач становится много, использую расширения для IDE (например, "TODO Highlight" в VSCode) — и визуально сразу видно все невыполненные задачи.
Почему это работает:
* Не надо держать всё в голове.
* Любой разработчик быстро вникает в текущие проблемы кода.
* Легче планировать рефакторинг.
* Сложно забыть про важную доработку.
Советую прямо сегодня попробовать добавить пару своих TODO в код. Дай знать, пользуешься ли ты таким приёмом или предпочитаешь другие методы? Пиши в комментариях!
👉 @php_lib
Когда проект становится чуть больше "визитки", начинают скапливаться мелкие задачи: что-то подправить, где-то доделать, что-то не забыть протестировать. В итоге куча мыслей крутится в голове, а шанс что-то упустить растёт. Как я с этим борюсь?
Я просто добавляю короткие TODO-комментарии в нужных местах кода. Например:
// TODO: Проверить валидацию email после изменений
// TODO: Перевести этот блок на отдельный сервис
Каждый раз перед коммитом быстро пробегаюсь по проекту поиском по "TODO" — и вижу все свои маленькие хвосты. А когда задач становится много, использую расширения для IDE (например, "TODO Highlight" в VSCode) — и визуально сразу видно все невыполненные задачи.
Почему это работает:
* Не надо держать всё в голове.
* Любой разработчик быстро вникает в текущие проблемы кода.
* Легче планировать рефакторинг.
* Сложно забыть про важную доработку.
Советую прямо сегодня попробовать добавить пару своих TODO в код. Дай знать, пользуешься ли ты таким приёмом или предпочитаешь другие методы? Пиши в комментариях!
👉 @php_lib
👍7🙈2🌚1
💡Совет по Laravel
Знаешь ли ты, что можно выбрасывать исключения условно всего в одну строку с помощью throw_if() — идеально для лаконичного кода в контроллерах и сервисах.
👉 @php_lib
Знаешь ли ты, что можно выбрасывать исключения условно всего в одну строку с помощью throw_if() — идеально для лаконичного кода в контроллерах и сервисах.
👉 @php_lib
👍7🥴3🔥1
💡Совет по Laravel
Строишь URL с динамическими параметрами для HTTP-запроса?
Не нужно вручную склеивать длинную строку!
Используй URI-шаблоны с методом
https://laravel.com/docs/12.x/http-client#uri-templates
👉 @php_lib
Строишь URL с динамическими параметрами для HTTP-запроса?
Не нужно вручную склеивать длинную строку!
Используй URI-шаблоны с методом
withUrlParameters()
— так код станет чище и понятнее при работе с API.https://laravel.com/docs/12.x/http-client#uri-templates
👉 @php_lib
👍5
strlen() vs mb_strlen(): Почему 71% PHP-разработчиков ошибаются
В этой статье разберем, как PHP работает со строками и почему даже простой вызов
https://habr.com/ru/articles/919192/
👉 @php_lib
В этой статье разберем, как PHP работает со строками и почему даже простой вызов
strlen()
может привести к неожиданным результатам. На примере крайне простой задачи "что выведет echo strlen('привет!');" посмотрим, что и как влияет на подсчет длины строки, заглянем внутрь реализации strlen()
и развенчаем миф о строках как массивах.https://habr.com/ru/articles/919192/
👉 @php_lib
👍4
Столкнулись с проблемой пересечения временных интервалов в вашем сервисе бронирования? В PostgreSQL есть решение, и мы готовы поделиться им с вами!
1 июля на вебинаре "Решение проблемы пересечения временных интервалов с использованием PostgreSQL" вы получите подробное руководство по использованию trigger functions и constraints для построения эффективной системы бронирования.
👨💻 Покажем, как использовать встроенные возможности PostgreSQL для упрощения разработки и повышения надежности системы.
💡 Для кого это важно? Для разработчиков на PHP, работающих с системами бронирования и ищущих лучшие практики.
Открытый урок проходит в преддверии старта курса «Разработчик на Spring Framework» — все участники получат скидку на обучение.
📅 Присоединяйтесь к вебинару и научитесь работать с PostgreSQL так, как этого требует реальная практика: https://vk.cc/cN4NdY
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
1 июля на вебинаре "Решение проблемы пересечения временных интервалов с использованием PostgreSQL" вы получите подробное руководство по использованию trigger functions и constraints для построения эффективной системы бронирования.
👨💻 Покажем, как использовать встроенные возможности PostgreSQL для упрощения разработки и повышения надежности системы.
💡 Для кого это важно? Для разработчиков на PHP, работающих с системами бронирования и ищущих лучшие практики.
Открытый урок проходит в преддверии старта курса «Разработчик на Spring Framework» — все участники получат скидку на обучение.
📅 Присоединяйтесь к вебинару и научитесь работать с PostgreSQL так, как этого требует реальная практика: https://vk.cc/cN4NdY
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Сегодня я покажу вам, как быстро разрулить хаос в проекте с кастомным фреймворком, где нет нормального логирования.
Ситуация: клиент дал старый проект, ошибок — куча, но логов нет вообще. В коде
Вот мой быстрый чеклист, который спасал не раз:
1. Глобальный обработчик ошибок и исключений
Добавил в
2. Простой логгер на каждый чих
Создал файл
В нужных местах пишу
3. Прокинул заголовки и запросы
В самых первых строках запроса:
Теперь видно, с чем именно клиент ломает мой старый код.
Не всегда есть время подтягивать Monolog и делать всё красиво. Иногда нужно быстро найти, где горит — и потушить. А уже потом наводить красоту.
А вы как действуете в таких ситуациях? Есть свои приёмы?
👉 @php_lib
Ситуация: клиент дал старый проект, ошибок — куча, но логов нет вообще. В коде
try-catch
, а в catch
— пусто. Что делать?Вот мой быстрый чеклист, который спасал не раз:
1. Глобальный обработчик ошибок и исключений
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
error_log("[PHP ERROR] $errstr in $errfile:$errline");
return false;
});
set_exception_handler(function (Throwable $e) {
error_log("[UNCAUGHT EXCEPTION] " . $e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine());
});
Добавил в
index.php
, и уже вижу, что именно валится.2. Простой логгер на каждый чих
Создал файл
logger.php
:
function log_debug($msg) {
file_put_contents(__DIR__.'/debug.log', date('[Y-m-d H:i:s] ') . $msg . PHP_EOL, FILE_APPEND);
}
В нужных местах пишу
log_debug('что-то случилось');
. Дёшево и сердито, зато работает.3. Прокинул заголовки и запросы
В самых первых строках запроса:
log_debug("REQUEST: " . $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI']);
log_debug("HEADERS: " . json_encode(getallheaders()));
log_debug("POST: " . json_encode($_POST));
Теперь видно, с чем именно клиент ломает мой старый код.
Не всегда есть время подтягивать Monolog и делать всё красиво. Иногда нужно быстро найти, где горит — и потушить. А уже потом наводить красоту.
А вы как действуете в таких ситуациях? Есть свои приёмы?
👉 @php_lib
👍11😁1💯1
Laravel lazy() против get()
Знаешь ли ты… что можно обрабатывать большие объёмы данных из базы с помощью lazy() — это гораздо эффективнее по памяти, чем get().
👉 @php_lib
Знаешь ли ты… что можно обрабатывать большие объёмы данных из базы с помощью lazy() — это гораздо эффективнее по памяти, чем get().
👉 @php_lib
👍6❤1
Хотите стать тимлидом на PHP? Задумывались, как сделать следующий шаг в своей карьере и перейти к менеджерской роли?
16 июля в 20:00 МСК OTUS проведет открытый вебинар «Что нужно знать, чтобы стать тимлидом на PHP». Мы подробно разберем, какие soft и hard skills нужны для этой роли, какую литературу стоит изучить, какие типичные вопросы задают на собеседованиях для тимлидов, и какие ожидания предъявляют компании.
Этот вебинар поможет не только тем, кто уже является тимлидом, но и разработчикам, стремящимся к карьерному росту. Узнайте, как подготовиться к качественно новому шагу в вашем профессиональном пути и получите практические рекомендации для карьерного роста.
Открытый урок пройдет в преддверии старта курса «PHP Developer. Professional». Все участники вебинара получат скидку на обучение.
Регистрация открыта: https://vk.cc/cNsThX
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
16 июля в 20:00 МСК OTUS проведет открытый вебинар «Что нужно знать, чтобы стать тимлидом на PHP». Мы подробно разберем, какие soft и hard skills нужны для этой роли, какую литературу стоит изучить, какие типичные вопросы задают на собеседованиях для тимлидов, и какие ожидания предъявляют компании.
Этот вебинар поможет не только тем, кто уже является тимлидом, но и разработчикам, стремящимся к карьерному росту. Узнайте, как подготовиться к качественно новому шагу в вашем профессиональном пути и получите практические рекомендации для карьерного роста.
Открытый урок пройдет в преддверии старта курса «PHP Developer. Professional». Все участники вебинара получат скидку на обучение.
Регистрация открыта: https://vk.cc/cNsThX
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👎3
💡Совет по Laravel
Знаешь ли ты… о методе skip в планировщике Laravel?
С помощью skip() можно указать, когда команда не должна выполняться.
👉 @php_lib
Знаешь ли ты… о методе skip в планировщике Laravel?
С помощью skip() можно указать, когда команда не должна выполняться.
👉 @php_lib
👍6🤣1
Простой, но полезный приём для дебага в Laravel — логирование SQL-запросов в человекочитаемом виде.
По умолчанию
Вот сниппет, который собирает полный SQL-запрос с подставленными значениями:
📌 Пример:
Очень удобно, когда ты хочешь понять, почему условие WHERE не сработало или почему запрос медленный.
Можно кинуть это в
👉 @php_lib
По умолчанию
DB::listen()
в Laravel выводит запрос с плейсхолдерами ?
, а значения параметров идут отдельно. Это не всегда удобно — сложно быстро понять, что реально выполняется.Вот сниппет, который собирает полный SQL-запрос с подставленными значениями:
DB::listen(function ($query) {
$sql = $query->sql;
foreach ($query->bindings as $binding) {
$binding = is_numeric($binding) ? $binding : "'{$binding}'";
$sql = preg_replace('/\?/', $binding, $sql, 1);
}
logger()->info("Executed query: {$sql}");
});
📌 Пример:
select * from users where email = 'john@example.com' and age > 18
Очень удобно, когда ты хочешь понять, почему условие WHERE не сработало или почему запрос медленный.
Можно кинуть это в
AppServiceProvider::boot()
, и на локальной машине всегда видеть, что реально уходит в базу.👉 @php_lib
👍12
💡 Совет для Laravel‑разработчиков
Используйте Crypt facade — он уже есть в Laravel:
- Работает на вашем APP_KEY
- Шифрует данные через AES‑256‑CBC
- Защищает от подделки (MAC) 🔐
Храните API‑токены, пароли и секреты безопасно — прямо из коробки.
👉 @php_lib
Используйте Crypt facade — он уже есть в Laravel:
- Работает на вашем APP_KEY
- Шифрует данные через AES‑256‑CBC
- Защищает от подделки (MAC) 🔐
Храните API‑токены, пароли и секреты безопасно — прямо из коробки.
👉 @php_lib
👍4
Совет по PHP/Laravel 🚀
Когда у вас есть два случая для кастомных исключений, относящихся к одному и тому же домену, вместо создания нескольких классов исключений можно использовать один класс с разными методами!
Так код будет чище и лучше структурирован! 💪🔥
👉 @php_lib
Когда у вас есть два случая для кастомных исключений, относящихся к одному и тому же домену, вместо создания нескольких классов исключений можно использовать один класс с разными методами!
Так код будет чище и лучше структурирован! 💪🔥
👉 @php_lib
👍5❤1🍓1
🚀 Вебинар: Тестируем скорость сайтов как профи с WebPageTest!
Привет, backend-разработчик! Ты уверен, что твой сайт летает, а не ползет, как улитка в пробке? 🐌💨
Бесплатный вебинар по WebPageTest покажет, как измерить скорость твоего веб-приложения без магии и шаманских бубнов: регистрация
Разберем:
✅ Как тестировать скорость правильно (спойлер: F5 – не метод)
✅ Что скрывает архитектура WebPageTest
✅ Как читать результаты тестов и не плакать
После вебинара ты сможешь:
🔹 Выбирать систему тестирования
🔹 Проводить тесты так, чтобы даже Google позавидовал
🔹 Анализировать результаты и чинить тормоза
📅 Регистрируйся → получишь напоминалку перед стартом: регистрация
P.S. Если хочешь прокачаться в оптимизации на 100%, приходи на курс «Оптимизация производительности веб-приложений». Не упусти шанс сделать сайты быстрее, чем твой коллег успевает сказать «Это не баг, это фича»! 😉
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Привет, backend-разработчик! Ты уверен, что твой сайт летает, а не ползет, как улитка в пробке? 🐌💨
Бесплатный вебинар по WebPageTest покажет, как измерить скорость твоего веб-приложения без магии и шаманских бубнов: регистрация
Разберем:
✅ Как тестировать скорость правильно (спойлер: F5 – не метод)
✅ Что скрывает архитектура WebPageTest
✅ Как читать результаты тестов и не плакать
После вебинара ты сможешь:
🔹 Выбирать систему тестирования
🔹 Проводить тесты так, чтобы даже Google позавидовал
🔹 Анализировать результаты и чинить тормоза
📅 Регистрируйся → получишь напоминалку перед стартом: регистрация
P.S. Если хочешь прокачаться в оптимизации на 100%, приходи на курс «Оптимизация производительности веб-приложений». Не упусти шанс сделать сайты быстрее, чем твой коллег успевает сказать «Это не баг, это фича»! 😉
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Как правильно работать с большими массивами данных в PHP, чтобы не убить память и сервер.
Когда мы пишем скрипты, которые обрабатывают тысячи (или миллионы) строк — будь то импорт из CSV, выгрузка из БД или массовая обработка, — часто допускается ошибка: всё грузится в память сразу. В итоге сервер умирает от нехватки памяти, а скрипт - от таймаута.
Что делать?
1. Частями, а не всё сразу
Например, если вы работаете с PDO:
Так данные не будут храниться в огромном массиве — обработка идёт построчно.
2. Используйте генераторы
Генераторы (
Память почти не растёт — магия генераторов.
3. Разбивайте на батчи
Иногда эффективнее брать кусками:
4. Не забывайте про стриминг файлов
Если это CSV или JSON — читайте построчно через
Такие подходы сильно упрощают жизнь и экономят ресурсы.
А вы как работаете с большими данными? Используете генераторы или предпочитаете батчи?
👉 @php_lib
Когда мы пишем скрипты, которые обрабатывают тысячи (или миллионы) строк — будь то импорт из CSV, выгрузка из БД или массовая обработка, — часто допускается ошибка: всё грузится в память сразу. В итоге сервер умирает от нехватки памяти, а скрипт - от таймаута.
Что делать?
1. Частями, а не всё сразу
Например, если вы работаете с PDO:
$stmt = $pdo->query("SELECT * FROM big_table");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
process($row); // Обрабатываем каждую строку на лету
}
Так данные не будут храниться в огромном массиве — обработка идёт построчно.
2. Используйте генераторы
Генераторы (
yield
) позволяют работать с большими данными лениво:
function getRows($pdo) {
$stmt = $pdo->query("SELECT * FROM big_table");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
yield $row;
}
}
foreach (getRows($pdo) as $row) {
process($row);
}
Память почти не растёт — магия генераторов.
3. Разбивайте на батчи
Иногда эффективнее брать кусками:
$limit = 1000;
for ($offset = 0; ; $offset += $limit) {
$rows = $pdo->query("SELECT * FROM big_table LIMIT $limit OFFSET $offset")->fetchAll();
if (!$rows) break;
foreach ($rows as $row) {
process($row);
}
}
4. Не забывайте про стриминг файлов
Если это CSV или JSON — читайте построчно через
fgets()
или stream_get_line()
, а не file_get_contents()
.Такие подходы сильно упрощают жизнь и экономят ресурсы.
А вы как работаете с большими данными? Используете генераторы или предпочитаете батчи?
👉 @php_lib
👍8❤1
💡Совет по Laravel: Проверка дат с помощью Carbon
Уверен, тебе хоть раз приходилось проверять, истекла ли дата или находится в будущем.
Так как Laravel под капотом использует Carbon, у тебя есть доступ к множеству удобных методов, которые позволяют делать это элегантно 🚀
👉 @php_lib
Уверен, тебе хоть раз приходилось проверять, истекла ли дата или находится в будущем.
Так как Laravel под капотом использует Carbon, у тебя есть доступ к множеству удобных методов, которые позволяют делать это элегантно 🚀
👉 @php_lib
👍5
Ответишь — пройдешь на продвинутый курс "PHP Developer. Professional" от OTUS по специальной цене.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Полный курс Laravel Swagger. REST API Laravel
00:00:00 Введение
00:04:25 Делаем заготовку
00:16:20 Установка Swagger
00:22:18 Общие аннотации и настройки Swagger
00:28:01 CRUD со Swagger
01:03:03 Установка JWT Auth
01:13:08 Авторизация и защищенные роуты в Swagger
01:20:20 Бонус. Нестандартные тело запроса и ответа
источник
👉 @php_lib
00:00:00 Введение
00:04:25 Делаем заготовку
00:16:20 Установка Swagger
00:22:18 Общие аннотации и настройки Swagger
00:28:01 CRUD со Swagger
01:03:03 Установка JWT Auth
01:13:08 Авторизация и защищенные роуты в Swagger
01:20:20 Бонус. Нестандартные тело запроса и ответа
источник
👉 @php_lib
👍7