Download the PHP package govorun/framework without Composer
On this page you can find all versions of the php package govorun/framework. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download govorun/framework
More information about govorun/framework
Files in govorun/framework
Package framework
Short Description Multi-messenger bot framework for PHP
License MIT
Informations about the package framework
Govorun Framework
Мульти-мессенджер бот-фреймворк на PHP 8.3+. Один код — разные мессенджеры (на сегодня поддерживается Telegram; интерфейсы готовы под Viber/WhatsApp). Используется визуальным билдером govorun-factory как целевой рантайм для сгенерированных проектов.
v3.x (breaking, краткая шпаргалка по миграции с v1.x):
Keyboard::button()/->row()удалены. ТолькоKeyboard::make()->buttons([[Button::make('…')->action('…'), …], …]).Button::make(...)+ fluent:->action(),->url(),->requestContact(),->requestLocation().Keyboard::reply()->resize()->oneTime()— fluent-флаги для reply-клавиатуры.Step::ask(string|OutgoingMessage $msg, Closure|Keyboard|null $keyboard)— клавиатуру можно передавать напрямую.- В
ControllerиFlowподмешан трейтMakesHttpCalls—$this->http()->connection('slug')->....
Быстрый старт
Положите токен в .env:
Установите вебхук:
Подробный пользовательский гид — govorun-skeleton. Если бот сгенерирован фабрикой — просто разверните ZIP, composer install, заполните .env и php govorun webhook:install.
Архитектура
Жизненный цикл запроса
Структура пакета
Application
Ядро. Наследует Illuminate\Container\Container.
| Метод | Описание |
|---|---|
basePath($path) |
Базовый путь проекта |
configPath($path) |
Путь к config/ |
storagePath($path) |
Путь к storage/ |
databasePath($path) |
Путь к database/ |
register(ServiceProvider) |
Зарегистрировать провайдер |
boot() |
Загрузить все провайдеры |
handleConsole() |
Обработать CLI-запрос |
handleWebhook(Request) |
Обработать вебхук |
loadRoutes() |
Загрузить routes/messenger.php |
Маршрутизация
DSL
Route::command('start', ...) нормализуется к /start — слеш можно опускать.
Приоритет
event > command > action > referral > media > location > contact > pattern > phrase > fallback
Middleware
Вложенные phrase
Алиасы
Controller
Базовый класс контроллера бота.
handle() вызывается без аргументов; альтернатива — __invoke().
| Свойство / метод | Тип | Описание |
|---|---|---|
$this->message |
IncomingMessage |
Входящее сообщение (предпочтительный доступ; $this->incomingMessage — deprecated алиас) |
$this->driver |
MessengerDriver |
Драйвер мессенджера |
$this->state |
StateAccessor |
PersistentState (write-through в storage), при отсутствии storage — пустая StateData |
reply(string $text) |
void |
Отправить текстовый ответ |
send(OutgoingMessage $msg) |
void |
Отправить сообщение (с клавиатурой/медиа) |
user() |
UserDto |
Данные отправителя |
param(string $key) |
?string |
Параметр callback-действия (для Route::action()) |
startFlow(string $class) |
void |
Запустить Flow-диалог |
http() (через MakesHttpCalls) |
HttpManager |
Доступ к подключениям ($this->http()->connection('slug')->...) |
Auto-finalize inline-клавиатуры
При отправке через send() сообщения с inline-клавиатурой, содержащей action-кнопки, контроллер сохраняет в storage контекст (message_id, original_text, parse_mode, текстовые лейблы кнопок). На следующем Action-сообщении исходное сообщение редактируется — клавиатура убирается, к тексту дописывается (выбрано: <label>). Ошибки driver->edit() не пробрасываются — это «вежливая» финализация.
Reply-клавиатуры, Keyboard::remove() и кнопки без action (только URL/requestContact/requestLocation) контекст не пишут.
Messaging
IncomingMessage
| Свойство | Тип | Описание |
|---|---|---|
id |
string |
ID сообщения |
chatId |
string |
ID чата |
driverName |
string |
Имя драйвера (telegram, …) |
text |
?string |
Текст |
user |
UserDto |
Отправитель |
type |
ContentType |
Тип контента |
action |
?string |
Callback-action |
actionParams |
?array |
Параметры action |
event |
?string |
Имя события |
media |
?MediaDto |
Медиа |
location |
?LocationDto |
Геолокация |
contact |
?ContactDto |
Контакт |
referral |
?string |
Реферальный код |
raw |
array |
Сырое тело апдейта |
ContentType (enum)
Text | Action | Media | Location | Contact | Event.
OutgoingMessage
Keyboard
Media
Telegram-драйвер дополнительно умеет отправлять локальные файлы — если в OutgoingMessage::$media['url'] лежит существующий локальный путь (а не URL), используется multipart-upload через Bot API.
Button
DTO
UserDto
| Свойство | Тип |
|---|---|
id |
string |
firstName |
?string |
lastName |
?string |
username |
?string |
phone |
?string |
locale |
?string |
raw |
array |
MediaDto / LocationDto / ContactDto
MediaDto: type, url, fileId, mimeType, fileSize, raw.
LocationDto: latitude, longitude, raw.
ContactDto: phone, firstName, lastName, userId, raw.
Flow (пошаговые диалоги)
Многошаговый диалог. Состояние сохраняется между шагами в StateStorage.
Свойства
| Свойство | Тип | Описание |
|---|---|---|
$steps |
array |
Имена шагов в порядке выполнения |
$interruptCommands |
array |
Команды, прерывающие flow |
$interruptOnEvent |
bool |
Прерывать при событии |
$state |
StateData |
In-memory данные шагов (сохраняются после ask/receive) |
Методы
| Метод | Описание |
|---|---|
start() |
Запуск с первого шага |
resume() |
Возобновление текущего шага (вызывает FlowHandler) |
nextStep(?string $name) |
Переход. Без аргумента — следующий по $steps; с именем — прыжок (goTo). Если текущий последний — completeFlow() |
reply(string $text) |
Текстовый ответ |
send(OutgoingMessage $msg) |
Отправка сложного сообщения |
validator(?string $value) |
Создать Validator с автоматической отправкой ошибки пользователю |
http() |
HttpManager (через трейт MakesHttpCalls) |
onComplete() / onCancel() |
Хуки |
Step
Клавиатура-Closure исполняется в bind'е Flow, поэтому имеет доступ к $this->state.
Прерывание
shouldInterrupt(IncomingMessage) возвращает true когда:
- Активна
ask_keyboard(есть__ask_keyboard_ctxв state) и пришёл текст — это значит пользователь не нажал кнопку, а написал что-то ещё. События в этом режиме не прерывают. $interruptOnEvent === trueи пришло событие.- Текст совпадает с одной из
$interruptCommands(или начинается на<cmd>).
Auto-finalize ask_keyboard
Если в шаге задана inline-клавиатура с action-кнопками, при отправке ask контекст сохраняется в state.__ask_keyboard_ctx. На nextStep() / onCancel() исходное сообщение редактируется: (выбрано: <label>) или (отменено). При прерывании по команде до выбора — финализация с (отменено).
State Storage
| Класс | Описание |
|---|---|
FileStateStorage |
JSON-файлы в storage/state/ |
DatabaseStateStorage |
Таблица govorun_states (создаётся миграцией) |
CacheStateStorage |
Кеш Illuminate с TTL |
Драйвер выбирается в config/state.php: driver (file/database/cache) + ttl (секунды).
StateAccessor
Общий контракт чтения/записи произвольных ключей состояния. Две реализации:
| Реализация | Где | Семантика записи |
|---|---|---|
StateData |
$this->state во Flow |
In-memory, флашится в storage в конце ask/receive |
PersistentState |
$this->state в Controller |
Write-through — каждый set() сразу пишет в storage |
| Метод | Описание |
|---|---|
get(string $key, mixed $default) |
Получить значение |
set(string $key, mixed $value) |
Сохранить значение |
has(string $key) |
Проверить наличие |
all() |
Получить весь массив |
HTTP
ConnectionClient (рекомендуемый путь)
Подключения к внешним API описаны в config/connections.php:
Трейт MakesHttpCalls подмешан в Controller и Flow:
| Тип auth | Конфиг |
|---|---|
none |
(без auth) |
bearer |
['type' => 'bearer', 'token' => '…'] → заголовок Authorization: Bearer … |
api_key (header) |
['type' => 'api_key', 'in' => 'header', 'key' => 'X-Api-Key', 'value' => '…'] |
api_key (query) |
['type' => 'api_key', 'in' => 'query', 'key' => 'api_key', 'value' => '…'] |
basic |
['type' => 'basic', 'login' => '…', 'password' => '…'] |
Опции Guzzle (json, form_params, query, headers, …) пробрасываются через второй аргумент. Таймаут по умолчанию — 10 секунд, http_errors=false (не бросает исключения на 4xx/5xx).
HttpResponse:
| Метод | Описание |
|---|---|
status(): int |
HTTP-статус |
successful(): bool |
2xx |
failed(): bool |
не 2xx |
body(): string |
сырое тело |
json(): ?array |
JSON-декод (null при ошибке) |
ApiClient (абстрактный, для собственных клиентов)
Альтернатива для случаев, когда удобнее иметь типизированный клиент-наследник, а не вызывать connection('slug'):
| Метод | Описание |
|---|---|
get(string $uri, array $params) |
GET |
post(string $uri, array $data) |
POST |
put(string $uri, array $data) |
PUT |
delete(string $uri) |
DELETE |
Validator
Govorun\Support\Validator — fluent-валидатор пользовательского ввода с lazy-load дефолтов из resources/validation-messages.json (синхронизирован с govorun-factory/resources/validation-messages.json — править одновременно).
В Flow есть шорткат $this->validator($value) — он сам отправит ошибку пользователю через errorHandler. Терминал — ->fails(): bool (true = ошибка уже отправлена пользователю):
Доступные правила: required, email, string, numeric, integer, url, phone, regex, min, max, between, in, date. Полный список — src/Support/Validator.php. Шаблоны сообщений — resources/validation-messages.json.
Middleware
Middleware складываются в pipeline. Если $next не вызван — цепочка прерывается.
Request
| Метод | Описание |
|---|---|
Request::capture() |
Создать из глобальных переменных |
getContent() |
Сырое тело |
json() |
Декодированный JSON |
header(string $name) |
Значение заголовка |
method() |
HTTP-метод |
uri() |
Полный URI |
path() |
Путь без query |
query(string $key, $default) |
Параметр строки запроса |
ServiceProvider
Подключение в config/app.php:
MessengerDriver (интерфейс)
| Метод | Описание |
|---|---|
verifyWebhook(Request) |
Проверить подпись запроса |
parseUpdate(Request) |
Распарсить в IncomingMessage |
send(OutgoingMessage) |
Отправить сообщение (вернуть ?string ID отправленного) |
edit(string $id, OutgoingMessage) |
Редактировать сообщение |
delete(string $id, string $chatId) |
Удалить сообщение |
installWebhook(string $url) |
Установить вебхук |
removeWebhook() |
Удалить вебхук |
getUser(string $id) |
Получить данные пользователя |
Telegram-драйвер дополнительно реализует методы для bot:profile-sync: setMyName, setMyShortDescription, setMyDescription, setMyCommands, setMyProfilePhoto, removeMyProfilePhoto.
CLI-команды
| Команда | Описание |
|---|---|
php govorun webhook:install |
Установить вебхуки для активных драйверов |
php govorun webhook:remove |
Удалить вебхуки |
php govorun migrate |
Запустить миграции БД |
php govorun make:controller {name} |
Создать контроллер из stub'а |
php govorun make:flow {name} |
Создать Flow-диалог |
php govorun make:api-client {name} |
Создать API-клиент |
php govorun state:clear |
Очистить состояния Flow |
php govorun bot:profile-sync |
Идемпотентная синхронизация Telegram-профиля (name / short_description / description / commands / photo) из config/bot_profile.php и storage/app/bot-profile.{jpg,mp4}. Флаги --only=<sec>... / --skip=<sec>... |
php govorun test |
Запустить тесты проекта |
Тестирование
В src/Testing/ лежат TestCase, FakeDriver, FakeMessenger, FakeApiClient и трейты — используются как в тестах фреймворка, так и из проектов-потребителей.
Лицензия
MIT
All versions of framework with dependencies
illuminate/container Version ^11.0
illuminate/config Version ^11.0
illuminate/support Version ^11.0
illuminate/events Version ^11.0
illuminate/database Version ^11.0
illuminate/cache Version ^11.0
illuminate/console Version ^11.0
illuminate/log Version ^11.0
guzzlehttp/guzzle Version ^7.0
vlucas/phpdotenv Version ^5.6