freezemage0/

discordphp-di

围绕 DiscordPHP 的包装器,集成了事件处理器的 DI 容器

v0.0.6 2022-08-15 20:47 UTC

This package is auto-updated.

Last update: 2024-09-16 01:35:07 UTC


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();

这种方法有两个主要缺陷

  1. 您必须在创建 EventHandler 实例之前创建所有依赖项;
  2. 您的 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.