Владимир Фетисов

Прототипирование

Адаптивная вёрстка

Программирование

SEO продвижение

Реклама, таргет

UX/UI интерфейсы


СКРЫТЬ

ПОКАЗАТЬ
Владимир Фетисов

Прототипирование

Адаптивная вёрстка

Программирование

SEO продвижение

Реклама, таргет

UX/UI интерфейсы

Блог

PHP Telegram bot + Laravel разработка с нуля `Урок – 6`

PHP Telegram bot + Laravel разработка с нуля `Урок – 6`

Статья на ЯндексДзен, подписывайтесь!

В прошлом уроке мы остановились на отправке сообщения в телеграм костыльным способом, так делать не нужно.
В этом уроке мы создадим контроллер, куда будут направляться POST запросы от телеграма и метод для их обработки, а также научимся их дебажить.
Также рассмотрим тестирование, в котором тоже можно будет имитировать отправку вебхуков.

Создание контроллера

Все контроллеры правильно размещать в папке \app\Http\Controllers. Мы конечно можем создать в ней новый файл, с названием контроллера, но об этом уже позаботились за нас.

Artisan – это интефрейс командной строки, в нем содержаться различные полезные команды, для быстрого создания моделеймиграцийконтроллеров и много чего еще.

Вы можете ввести в консоли php artisan, чтобы увидеть список доступных команд:

Список доступных команд php artisan
Список доступных команд php artisan

Нас интересует создание контроллера, это легко сделать командой
php artisan make:controller WebhookController

Названия контроллеров принято заканчивать ключевым словом Controller, полсе запуска команды мы должны увидеть, что в нашей папке с контроллерами появился новый.

Созданный WebhookController
Созданный WebhookController

Теперь создадим в контроллере новый метод __invoke, который будет принимать Request и возвращать response

метод __invoke в WebhookController
метод __invoke в WebhookController

Удалим все ненужное из web.php и направим запрос в наш контроллер

Чистим web.php
Чистим web.php

Попробуем отправить нашему боту команду или любое другое сообщение, чтобы убедится что все работает как и прежде

Проверяем работу WebhookController
Проверяем работу WebhookController

Отладка, Debug вебхуков из телеграм

Когда мы пишем код или ищем ошибку всегда хочется вывести переменную, чтобы посмотреть что в ней находятся и к чему можно обратиться.

Inspector от Ngrok позволяет посмотреть тело входящего запроса, но как быть дальше? Если появилась ошибка где то при сохранении, изменении данных, в каком то методе, этого Ngrok уже не покажет, да и телеграм, не получив 200 ответ на отправленный вебхук начнет присылать его постоянно, генерируя все больше ошибок и Inspecor просто зависнет, в нем нельзя будет даже прочитать ошибку, которую вернет Laravel.

Обычно при дебаге мы используем дефолтную функции var_dump() для вывода значений переменной и die() что бы остановить выполнение кода.
В Laravel на этот случай есть удобная функция dd().
Давайте посмотрим как она работает:

Я создал временный роут /debug и массив $someArr с какими-то значениями.

Создали тестовый массив для проверки работы dd()
Создали тестовый массив для проверки работы dd()

Напишем dd($someArr); и зайдем на новый роут:

функция dd() в ларавель
функция dd() в ларавель

Функция очень красиво и удобно вывела всю информацию о переменной и даже место где она была вызвана.
Значит мы можем так же вывести и $request, который приходит к нам в WebhookController, но как его посмотреть? В решении этой проблемы нам поможет Postman.

Имитация вебхуков через Postman

Postman очень удобный сервис, позволяющий отправлять разные типы запросов с различными способоми верификации прям из браузера, сохранять их и объеденять в проекты.

Первым делом нужно создать аккаунт на официальном сайте и авторизоваться.
После чего заходим в My Workspace

Postman где найти моё рабочее место
Postman где найти моё рабочее место

Создадим новую коллекцию и придумаем ей название, будем хранить в ней все необходимые запросы к нашему телеграм боту

Создание новой коллекции
Создание новой коллекции

Теперь добавим новый запрос

Добавление нового запроса
Добавление нового запроса

Я назвал его /start, т.к. он будет имитировать ввод соответствующей команды пользователем, выбираем метод POST и указываем адрес куда будет отправляться запрос, это наш домен ngrok

Помните что при каждом запуске ngrok у вас будет новый адрес, если вы пользуйтесь бесплатной версией

Настраиваем созданный запрос
Настраиваем созданный запрос

Осталось поместить в него тело запроса, скопированное из инспектора и сохранить.

Добавляем тело запроса и сохраняем
Добавляем тело запроса и сохраняем

Теперь попробуем продебажить реквест, который должен прийти в контроллер, добавим dd($request);

Дебажим реквест
Дебажим реквест

Теперь в постмане жмём синюю кнопку Send, отправляя запрос и заходим во вкладку Preview снизу, что бы посмотреть ответ

Вкладка preview
Вкладка preview

Отлично, таким образом можно поставить dd() в любом месте по ходу выполнения кода, отправить запрос через Postman и продебажить что нам нужно!

Тестирование, имитация отправки вебхуков через тесты

В Laravel предусмотрено довольно простое написание и запуск тестов, они располагаются в папке \app\tests. Если мы заглянем в папку \app\tests\Feature, увидим там уже созданный пример теста

Пример теста
Пример теста

Давайте для примера немного изменим тест, что бы он имитировал отправку хука, тело запроса так же можно взять из инспектора.

Отредактируем дефолтный пример теста
Отредактируем дефолтный пример теста

$response->assertStatus(200);
Означает что тест будет пройденесли в ответ получит 200 статус. Мы как раз его и возвращаем в нашем контроллере. Давайте попробуем запустить тест, для этого опять обратимся к Artisan и запустим команду:
php artisan test

Пробуем пройти тест
Пробуем пройти тест

Теперь опять попробуем вывести наш реквест dd($request); и запустим тест еще раз.

Дебажим реквест
Дебажим реквест

Смотрим что вывелось в консоль после запуска теста
Смотрим что вывелось в консоль после запуска теста

Как видно мы смогли имитировать отправку запроса и даже его продебажить, правда в консоли все отображается явно не так удобно, как в Postman.
Поэтому дебажить таким способом вебхуки на мой взгляд плохая идея..

Однако тестами можно и нужно пользоваться, вы можете имитировать отправку запросовзаход на страницуаутентификациюзапись в базу данных и многое другое.

Покрыв своё приложение тестами, после внесения правок вы всегда быстро сможете проверить ничего ли они вам не сломали😁

Подробнее про тестирование можно почитать в официальной документации

Ссылка на commit из 6 урока

Полезные ссылки

Taggs:
Написать комментарий