freezemage0 / discordphp-di
围绕 DiscordPHP 的包装器,集成了事件处理器的 DI 容器
v0.0.6
2022-08-15 20:47 UTC
Requires
- php: ^7.4
- psr/container: *
- team-reflex/discord-php: ^7.1
Suggests
- php-di/php-di: DI Container
README
描述
此包允许您将 DI 容器
与您的 Discord\Discord
客户端集成。每当发生 Event
时,您的 EventHandler
将自动在运行时构建。
安装
此包可以通过 composer
安装
composer require freezemage0/discordphp-di
用法
假设您有一个 EventHandler
类
<?php class EventHandler { private DatabaseDriver $driver; private Cache $cache; public function __construct(DatabaseDriver $driver, Cache $cache) { $this->driver = $driver; $this->cache = $cache; } public function handleOnGuildJoin(): void { // your code ... } }
现在您可以注册您的 EventHandler
作为 Discord 事件的处理器
<?php $handler = new EventHandler( new DatabaseDriver(), new Cache() ); $discord = new \Discord\Discord(); $discord->on('GUILD_CREATE', [$handler, 'handleOnGuildJoin']); $discord->run();
这种方法有两个主要缺陷
- 您必须在创建
EventHandler
实例之前创建所有依赖项; - 您的
EventHandler
可能实际上永远不会在运行时被调用,但它仍然分配内存。
freezemage0/discordphp-di
允许您消除这些缺陷,请参阅以下内容
<?php // Take note that in this example we will use `php-di/php-di` package. $container = \DI\ContainerBuilder::buildDevContainer(); $builder = new \Freezemage\Discord\Builder($container); $discord = $builder->build(); // This will instantiate Discord\Discord class! $discord->on('GUILD_CREATE', [EventHandler::class, 'handleOnGuildJoin']); $discord->run();
现在,您的 EventHandler
将仅在事件实际触发时实例化(并解决其依赖项)。
集成到现有的 Discord\Discord
实例中
如果您扩展了 Discord\Discord
类以添加自己的功能,则可以使用 $builder->wrap($myDiscordInstance);
注入容器并保留自定义定义的行为。
$discord = new \MyProject\MyDiscord(); // extends \Discord\Discord; $builder = new \Freezemage\Discord\Builder($container); $discord = $builder->wrap($discord); // now $discord has Container injected with original class preserved.