Handling Updates
When the bot receives an update, the library passes it through a pipline of registered handlers. Each handler must check if it should handle the update and may optionally stop further processing.
The library supports two ways to handle updates:
Use closures for simple tasks to keep your codebase clean:
$handler = function(TeleBot $bot, Update $update, $next) {
if ($update->message->text === '/start') {
return $bot->sendMessage(
chat_id: $update->chat()->id,
text: 'Hello, World!'
);
}
return $next();
};Registering Handlers
Handlers must be registered in your bot instance:
$bot = new TeleBot([
'token' => '<your bot token>',
'kernrel' => [
\App\YourUpdateHandler::class,
$handler
]
]);
// Or add later
$bot->handler(\App\YourUpdateHandler::class);
$bot->handler($handler);Custom Kernel
Customize the handling pipeline by extending Kernel.
<?php
namespace App;
use WeStacks\TeleBot\Kernel as TeleBotKernel;
use WeStacks\TeleBot\TeleBot;
class Kernel extends TeleBotKernel
{
public function __construct()
{
parent::__construct([
\App\YourUpdateHandler::class,
]);
}
public function setCommands(TeleBot $bot)
{
return $bot->setMyCommands([
'commands' => $this->getLocalCommands(),
'scope' => 'default'
]);
}
public function deleteCommands(TeleBot $bot)
{
return $bot->deleteMyCommands([
'scope' => 'default'
]);
}
}$bot = new TeleBot([
'token' => '<your bot token>',
'kernel' => \App\Kernel::class
]);Bot Commands
The library provides a CommandHandler for handling bot commands efficiently.
<?php
namespace App;
use WeStacks\TeleBot\Foundation\CommandHandler;
class StartCommand extends CommandHandler
{
protected static function aliases(): array
{
return ['/start', '/s'];
}
protected static function description(?string $locale = null): string
{
return trans('Start the bot', locale: $locale);
}
public function handle()
{
return $this->sendMessage([
'text' => 'Hello, World!'
]);
}
}Requesting User Input
The library has a built-in state storage for requesting user input via RequestInputHandler. By default it will handle any update given by the user. You can change this behavior by extending trigger() method in your handler.
<?php
namespace App;
use WeStacks\TeleBot\Foundation\RequestInputHandler;
class AskNameHandler extends RequestInputHandler
{
public function handle()
{
$data = $this->update->message()->toArray();
$validator = Validator::make($data, [
'text' => 'required|string|max:255'
]);
if ($validator->fails()) {
return $this->sendMessage([
'text' => 'Invalid input!'
]);
}
$this->accept();
$name = $validator->validated()['text'];
return $this->sendMessage([
'text' => "Hello, $name!",
]);
}
}Custom State Storage
Default: WeStacks\TeleBot\Foundation\FileStorage. You can use Redis, database, or your own.
<?php
namespace App;
use App\Models\User;
use WeStacks\TeleBot\Contracts\StorageContract;
class DatabaseStorage implements StorageContract
{
public function get(string $key, $default = null): mixed
{
return User::where('telegram_id', $key)->value('input_state') ?? $default;
}
public function set(string $key, $value): true
{
return User::where('telegram_id', $key)->update(['input_state' => $value]);
}
public function delete(string $key): true
{
return $this->set($key, null);
}
}Callback Queries
Use CallbackHandler for managing callback queries.
<?php
namespace App;
use WeStacks\TeleBot\Foundation\CallbackHandler;
class ButtonPressHandler extends CallbackHandler
{
protected string $match = "/^test:(delete|update):(\d+)$/";
public function handle()
{
[$action, $id] = $this->arguments();
match ($action) {
'update' => $this->update($id),
'delete' => $this->delete($id),
};
$this->answerCallbackQuery();
}
}Handling Updates
Telegram will send updates to your webhook URL using POST requests.
$bot->setWebhook([
'url' => 'https://example.com/webhook.php'
]);
$bot->handle(
Update::from(file_get_contents('php://input'))
);