Adding state
Some flows need to remember where the user is. phpbotgram's FsmContext provides per-user/per-chat key-value storage; the StateFilter gates handlers on the current state name.
This lesson builds a two-step "register" flow without using scenes (those land in the scene how-to).
Inline FSM
use Gruven\PhpBotGram\Filters\Command;
use Gruven\PhpBotGram\Filters\StateFilter;
use Gruven\PhpBotGram\Fsm\FsmContext;
use Gruven\PhpBotGram\Types\Message;
$dispatcher->message->register(
static function (Message $event, FsmContext $state): void {
$state->setState('register:name');
$event->answer('What is your name?')->emit();
},
filters: [new Command('register'), new StateFilter(null)],
);
$dispatcher->message->register(
static function (Message $event, FsmContext $state): void {
$state->updateData(['name' => $event->text ?? '']);
$state->setState('register:age');
$event->answer('How old are you?')->emit();
},
filters: [new StateFilter('register:name')],
);
$dispatcher->message->register(
static function (Message $event, FsmContext $state): void {
$data = $state->getData();
$data['age'] = $event->text ?? '';
$event->answer("Registered: {$data['name']}, age {$data['age']}.")->emit();
$state->clear();
},
filters: [new StateFilter('register:age')],
);
The framework injects FsmContext $state
automatically — the parameter name state
is the kwarg key the dispatcher binds. setState(null)
matches handlers gated on StateFilter(null)
(i.e. "no active state").