Роутинг
Роутинг в Laravel Async Telegram позволяет определять обработчики для различных типов обновлений от Telegram. API очень похож на стандартный роутинг Laravel, что делает его интуитивно понятным.
Базовые концепции
Section titled “Базовые концепции”Фасад TelegramRouter
Section titled “Фасад TelegramRouter”Все роуты регистрируются через фасад TelegramRouter:
use HybridGram\Facades\TelegramRouter;
TelegramRouter::onCommand('/start', function(CommandData $data) { // Обработка команды /start});Структура обработчика
Section titled “Структура обработчика”Обработчик роута получает объект данных (например, CommandData, MessageData), который содержит:
$data->update— полный объект Update от Telegram$data->botId— ID бота, для которого сработал роут$data->getChat()— объект Chat$data->getUser()— объект User- Дополнительные свойства в зависимости от типа данных
Типы роутов
Section titled “Типы роутов”Команды (Commands)
Section titled “Команды (Commands)”Обработка команд, начинающихся с /:
use HybridGram\Facades\TelegramRouter;use HybridGram\Core\Routing\RouteData\CommandData;
// Простая командаTelegramRouter::onCommand('/start', function(CommandData $data) { $telegram = app(\HybridGram\Telegram\TelegramBotApi::class); $telegram->sendMessage($data->getChat()->id, 'Привет!');});
// Команда с параметрамиTelegramRouter::onCommand('/help', function(CommandData $data) { // $data->commandParams содержит массив аргументов после команды $params = $data->commandParams; // ...});
// Команда для конкретного ботаTelegramRouter::forBot('main')->onCommand('/start', function(CommandData $data) { // ...});Сообщения (Messages)
Section titled “Сообщения (Messages)”Обработка текстовых сообщений:
use HybridGram\Facades\TelegramRouter;use HybridGram\Core\Routing\RouteData\TextMessageData;
// Все сообщенияTelegramRouter::onMessage(function(TextMessageData $data) { $message = $data->message; // ...});
// Сообщения по паттернуTelegramRouter::onMessage(function(TextMessageData $data) { // ...}, '*', 'привет'); // Паттерн для проверки текста
// Кастомная проверка через closureTelegramRouter::onMessage(function(TextMessageData $data) { // ...}, '*', function(TextMessageData $data) { return str_contains($data->message, 'hello');});Callback Query
Section titled “Callback Query”Обработка нажатий на inline кнопки:
use HybridGram\Facades\TelegramRouter;use HybridGram\Core\Routing\RouteData\CallbackQueryData;
// Все callback queryTelegramRouter::onCallbackQuery(function(CallbackQueryData $data) { $callbackQuery = $data->callbackQuery; $action = $data->action; $params = $data->params; // ...});
// Callback query по паттерну (например, action="menu:home")TelegramRouter::onCallbackQuery(function(CallbackQueryData $data) { // ...}, '*', 'menu:*');
// С проверкой query параметровTelegramRouter::onCallbackQuery(function(CallbackQueryData $data) { // ...}, '*', '*', ['category' => 'products']); // только если есть category=productsРабота с несколькими ботами
Section titled “Работа с несколькими ботами”Если у вас несколько ботов, вы можете указать конкретный бот:
// Для конкретного ботаTelegramRouter::forBot('main')->onCommand('/start', function(CommandData $data) { // ...});
// Для всех ботов (по умолчанию)TelegramRouter::onCommand('/start', function(CommandData $data) { // ...});Фильтрация по типу чата
Section titled “Фильтрация по типу чата”Роуты могут быть ограничены определенными типами чатов (приватные, группы, супергруппы, каналы).
Один тип чата
Section titled “Один тип чата”Используйте метод chatType() для указания одного типа чата:
use HybridGram\Facades\TelegramRouter;use HybridGram\Core\Routing\ChatType;
// Роут только для приватных чатов (дефолт для большинства типов)TelegramRouter::forBot('main') ->chatType(ChatType::PRIVATE) ->onCommand('/start', function(CommandData $data) { // Обработка только в приватных чатах });
// Роут только для группTelegramRouter::forBot('main') ->chatType(ChatType::GROUP) ->onTextMessage(function(\HybridGram\Core\Routing\RouteData\TextMessageData $data) { // Обработка только в группах });Несколько типов чатов
Section titled “Несколько типов чатов”Используйте метод chatTypes() для указания нескольких типов чатов:
use HybridGram\Facades\TelegramRouter;use HybridGram\Core\Routing\ChatType;
// Роут работает в приватных чатах и группахTelegramRouter::forBot('main') ->chatTypes([ChatType::PRIVATE, ChatType::GROUP]) ->onCommand('/help', function(CommandData $data) { // Обработка в приватных чатах и группах });
// Роут работает во всех типах чатовTelegramRouter::forBot('main') ->chatTypes(null) // или не указывать для групповых событий ->onMyChatMember(function(ChatMemberUpdatedData $data) { // Обработка во всех типах чатов });Умные дефолты
Section titled “Умные дефолты”Система автоматически устанавливает разумные дефолты в зависимости от типа роута:
Роуты, которые по умолчанию работают во всех типах чатов:
onMyChatMember()— изменения статуса ботаonChatMember()— изменения статуса участниковonNewChatTitle()— изменение названия чатаonNewChatPhoto()— изменение фото чатаonDeleteChatPhoto()— удаление фото чатаonPinnedMessage()— закрепление сообщенийonForumTopicEvent()— события топиков форумаonGeneralForumTopicEvent()— события общего топикаonMessageAutoDeleteTimerChanged()— изменение таймера автоудаленияonBoostAdded()— добавление буста
Остальные роуты по умолчанию работают только в приватных чатах:
onCommand()— командыonMessage()— сообщенияonCallbackQuery()— callback query- И другие…
// Работает во всех типах чатов (дефолт для MY_CHAT_MEMBER)TelegramRouter::onMyChatMember(function(ChatMemberUpdatedData $data) { // Обработка добавления бота в группу/канал});
// Работает только в приватных чатах (дефолт для COMMAND)TelegramRouter::onCommand('/start', function(CommandData $data) { // Обработка команды});
// Явно указать несколько типов для командыTelegramRouter::forBot('main') ->chatTypes([ChatType::PRIVATE, ChatType::GROUP]) ->onCommand('/admin', function(CommandData $data) { // Команда работает в приватных чатах и группах });Типы чатов
Section titled “Типы чатов”Доступные типы чатов:
use HybridGram\Core\Routing\ChatType;
ChatType::PRIVATE // Приватные чатыChatType::GROUP // ГруппыChatType::SUPERGROUP // СупергруппыChatType::CHANNEL // КаналыГруппировка роутов
Section titled “Группировка роутов”Вы можете группировать роуты с общими атрибутами, включая тип чата:
use HybridGram\Facades\TelegramRouter;use HybridGram\Core\Routing\ChatType;
TelegramRouter::group([ 'for_bot' => 'main', 'chat_type' => ChatType::GROUP, // Один тип 'middlewares' => [AuthTelegramRouteMiddleware::class],], function($router) { $router->onCommand('/admin', function(CommandData $data) { // ... });});
// Или несколько типовTelegramRouter::group([ 'for_bot' => 'main', 'chat_type' => [ChatType::PRIVATE, ChatType::GROUP], // Массив типов], function($router) { $router->onMessage(function(MessageData $data) { // ... });});Паттерны и фильтрация
Section titled “Паттерны и фильтрация”Строковые паттерны
Section titled “Строковые паттерны”Многие типы роутов поддерживают строковые паттерны с использованием *:
// Команда с параметрамиTelegramRouter::onCommand('/user:*', function(CommandData $data) { $userId = $data->commandParams[0] ?? null; // ...});
// Callback queryTelegramRouter::onCallbackQuery(function(CallbackQueryData $data) { // $data->action будет содержать "menu:products" // $data->params будет содержать ['category' => 'electronics']}, '*', 'menu:*', ['category' => null]); // category должен быть присутствоватьClosure паттерны
Section titled “Closure паттерны”Для более сложной логики используйте closures:
TelegramRouter::onMessage(function(MessageData $data) { // ...}, '*', function(MessageData $data) { // Возвращайте true, если роут должен сработать return $data->message->text !== null && strlen($data->message->text) > 100;});Дополнительные типы роутов
Section titled “Дополнительные типы роутов”Пакет поддерживает множество других типов обновлений:
onPhoto— фотографииonDocument— документыonLocation— геолокацияonContact— контактыonPoll— опросыonInlineQuery— inline запросыonAny— любые обновления- И многое другое
Подробнее о каждом типе смотрите в соответствующих разделах.
Fallback роуты
Section titled “Fallback роуты”Роут, который срабатывает, если не найден подходящий обработчик:
TelegramRouter::onFallback(function(FallbackData $data) { $telegram = app(\HybridGram\Telegram\TelegramBotApi::class); $telegram->sendMessage($data->getChat()->id, 'Команда не распознана');});В режиме разработки (app()->isLocal()) fallback автоматически отправляет информацию о состоянии для отладки.
Что дальше?
Section titled “Что дальше?”- Обработка команд — детальная работа с командами
- Обработка сообщений — работа с текстовыми сообщениями
- Callback Query — обработка нажатий на кнопки