ufo-engineering/ko-events

Kohana框架的事件系统

v2.0.2 2017-11-23 15:53 UTC

This package is not auto-updated.

Last update: 2024-09-29 05:01:36 UTC


README

此版本经过(一些更改)从此包转换而来,特别适用于通过composer使用https://packagist.org.cn/packages/unxp/kohana-events

Kohana框架的事件系统

发布于 2017-11-20

由 ufo-engineering

安装

composer require ufo-engineering/ko-events

配置

..vendor/ufo-engineering/ko-events/config/events.php复制到application/config/events.php。所有事件及其处理器都必须在application/config/events.php配置文件中注册(默认)。但是,如果不存在events.php,库将尝试从数据库获取配置。您应该执行此文件的配置表转储events_tables.sql。目前,如果您选择数据库来存储配置数据,您应该手动添加特定数据。因此,对于普通任务,我们建议使用配置文件。配置被设计为针对每个环境的四个部分,但您也可以添加自己的。要注册一个事件,将它的类名作为数组键,并将它的处理器作为值。

示例

return [
    'events_handlers' => [
        'Event_Test'       => ['Handler_EventTest'], //Event_Test is real class in dir application/classes/Event/Test.php
        'someTestMethod'   => ['Handler_EventTest'] // alias, for example method name
        //...
        ]
];

用法

  • 创建一个事件类 ... application/classes/Event/Test.php
/**
 * Class Event_Test
 *
 * Fired when we do something
 */
class Event_Test
{
    /**
     * @var Model_Test
     */
    public $test;

    /**
     * @param Model_Test $test
     */
    function __construct(Model_Test $test)
    {
        $this->test = $test;
    }
}
  • 创建一个处理器类
/**
 * Class Handler_EventTest
 *
 * For example: sends an email notification to user about successful registration
 */
class Handler_EventTest implements Ufo\Handler\EventHandler
{
    /**
     * Handle an event
     *
     * @param Handler_EventTest $event
     *
     * @return bool|null
     */
    public function handle($event)
    {
        // TODO send email
    }
}
  • 触发事件
use Ufo\Event;

Event::fire(new Event_Test($user));
OR
Event::fire('someTestMethod', $user);

所有事件处理器将按它们在events.php文件或数据库中定义的顺序执行。通过使handle方法返回false,您可以中断链并不再执行其他处理器。

额外

有一个额外的类EventHandlerNotification,用于轻松处理事件通知。但是,它需要来自https://github.com/shadowhand/email的Kohana邮件模块,或者您可以为您的需求调整邮件发送。

要使用此辅助程序,只需使您的处理器扩展此类并实现formatSubjectgetReceivers方法。

示例

/**
 * Class Event_Handler_User_SendWelcomeEmail
 *
 * Sends an email notification to user about successful registration
 */
class Event_Handler_User_SendWelcomeEmail extends Ufo\Handler\Notification\EventHandlerNotification implements Ufo\Handler\EventHandler
{
    /**
     * Handle an event
     *
     * @param Event_User_Registered $event
     *
     * @return bool|null
     */
    public function handle($event)
    {
        $this->send($event, 'Welcome aboard user ' . $event->user->username . '!');
    }

    /**
     * Format email notification subject
     *
     * @param Event_User_Registered $event
     *
     * @return string
     */
    protected function formatSubject($event)
    {
        return 'Welcome ' . $user->username;
    }

    /**
     * Get notification receivers list
     *
     * @param Event_User_Registered $event
     *
     * @return array
     */
    protected function getReceivers($event)
    {
        return array(
            $event->user->email => $event->user->username
        );
    }
}

表格

CREATE TABLE `action_handlers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `placeholders` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `system_actions` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL,
  `handler_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

*一些更改

  1. 添加了对别名的支持
  2. 添加了数据库配置表