Перейти к содержимому

Компонентный конструктор ботов

Современный ООП-подход на основе атрибутов и Event Dispatcher

Данный подход основан на атрибутах PHP 8 и компонентной архитектуре. Команды и кнопки объявляются в виде отдельных классов, а диспетчер автоматически направляет события соответствующим обработчикам, ориентируясь на text или payload входящего события.

Это позволяет создавать сложных, хорошо структурированных и легко поддерживаемых ботов, собирая их из независимых объектно-ориентированных компонентов.

Идеально подходит для:

  • Крупных и долгосрочных проектов: Легко добавлять новую функциональность, не ломая старую.
  • Чистого кода: Обеспечивает четкое разделение ответственности.
  • Тестирования: Каждый компонент можно тестировать в изоляции.
  • Командной разработки: Разные разработчики могут параллельно работать над разными компонентами.

Простой пример использования

php
// Файл: /Action/StatusButton.php
<?php
namespace App\Action;
use DigitalStars\SimpleVK\Attributes\{AsButton, Trigger};
use DigitalStars\SimpleVK\EventDispatcher\{Context, BaseButton};

#[AsButton(label: 'Статус', color: 'green')]
#[Trigger(command: '/status')]
class StatusButton extends BaseButton {
	//Сработает при нажатии на кнопку или на /status
    public function handle(Context $ctx, ...$args): void {
        $ctx->vk->reply('Бот онлайн! ✅');
    }
}
php
// Файл: /Action/MainMenuCommand.php
<?php
namespace App\Action;
use App\Action\StatusButton; // <-- Импортируем нашу кнопку
use DigitalStars\SimpleVK\Attributes\Trigger;
use DigitalStars\SimpleVK\EventDispatcher\{Context, BaseCommand};

#[Trigger(command: '/start')]
#[Trigger(command: '/menu')]
class MainMenuCommand extends BaseCommand {
	//Сработает на /menu или /start
    public function handle(Context $ctx, ...$args): void {
	    $btn = new StatusButton();
        $ctx->vk->msg('Главное меню')->kbd($btn, inline: true)->send();
    }
}
php
// Файл: bot.php
<?php
require_once __DIR__ . '/vendor/autoload.php';

use DigitalStars\SimpleVK\SimpleVK;
use DigitalStars\SimpleVK\EventDispatcher\EventDispatcher;

$vk = SimpleVK::create("ТОКЕН", "5.199");

// 3. Создание и конфигурация Диспетчера
$dispatcher = new EventDispatcher($vk, [
    // Указываем корневой namespace для автозагрузки классов
    'root_namespace' => 'App',
    // Указываем путь к папке с нашими Action-компонентами
    'actions_paths' => [
        __DIR__ . '/Action',
    ],
]);

$dispatcher->handle();

Файл: composer.json

json
"autoload": {
  "psr-4": {
    "App\\": "./"
  }
}
bash
composer dump-autoload -o

Опубликовано под лицензией MIT.