Skip to content

Commit

Permalink
trigger 方法返回 bool 类型:是否执行了当前事件的监听器
Browse files Browse the repository at this point in the history
  • Loading branch information
ueaner committed Nov 4, 2018
1 parent f194a0a commit 1f72f7e
Show file tree
Hide file tree
Showing 9 changed files with 176 additions and 107 deletions.
3 changes: 3 additions & 0 deletions .coveralls.yml
@@ -0,0 +1,3 @@
service_name: travis-ci
coverage_clover: build/logs/clover.xml
json_path: build/logs/coveralls-upload.json
41 changes: 41 additions & 0 deletions .travis.yml
@@ -0,0 +1,41 @@
dist: trusty
sudo: false

language: php

env:
global:
- COMPOSER_ARGS="--ansi --prefer-dist --no-interaction --no-suggest --no-progress --optimize-autoloader"
- DEPS="phpunit/phpunit squizlabs/php_codesniffer php-coveralls/php-coveralls"

git:
depth: 3

cache:
directories:
- $HOME/.composer/cache

matrix:
fast_finish: true
allow_failures:
- php: hhvm
- php: nightly
include:
- php: 5.5
- php: 5.6
- php: 7.0
- php: 7.1
env: ANALYSIS="true"
- php: 7.2
- php: hhvm
- php: nightly

before_script:
- composer require --dev $COMPOSER_ARGS $DEPS

script:
- php vendor/bin/phpunit
- if [[ "$ANALYSIS" == "true" ]]; then php vendor/bin/phpcs ; fi

after_script:
- if [[ "$ANALYSIS" == "true" && -f ./build/logs/clover.xml ]]; then php vendor/bin/php-coveralls -v; fi
41 changes: 15 additions & 26 deletions README.md
@@ -1,29 +1,18 @@
Soli Event Manager
------------------

当前项目参考 [Phalcon 框架的事件管理器]实现
事件管理器,管理事件的注册、删除和调度(触发)

事件管理器的目的是为了通过创建"钩子"拦截框架或应用中的部分组件操作。

这些钩子允许开发者获得状态信息,操纵数据或者改变某个组件进程中的执行流向。

以上介绍摘自[Phalcon 框架的事件管理器]官方文档。
[![Build Status](https://travis-ci.org/soliphp/events.svg?branch=master)](https://travis-ci.org/soliphp/events)
[![Coverage Status](https://coveralls.io/repos/github/soliphp/events/badge.svg?branch=master)](https://coveralls.io/github/soliphp/events?branch=master)
[![License](https://poser.pugx.org/soliphp/events/license)](https://packagist.org/packages/soliphp/events)

## 安装

使用 `composer` 安装到你的项目:

composer require soliphp/events

## 命名约定

当前事件管理器的命名规则采用分组的方式,目的是为了避免不同组件间的事件名称重名,产生碰撞,
同时也便于对项目中同一维度的事件进行聚合整理;事件命名格式为 "component.event",
类比类的命名空间,我们暂且将这种对事件的命名方式称之为「事件命名空间」。

如,我们有一个 `\Soli\Application` 类,它的事件命名空间可以定义为 "application",
对于此类 "boot" 事件的全名为 "application.boot"。

## 使用

### 针对具体的某个事件设置监听器
Expand All @@ -33,25 +22,25 @@ Soli Event Manager

$eventManager = new EventManager();

$eventManager->attach('application.boot', function (Event $event, $application) {
$eventManager->attach('app.boot', function (Event $event, $app) {
echo "应用已启动\n";
});

`监听器的格式`,可以是 `匿名函数或对象实例`

如,我们这里定义一个 `AppEvents` 类用于处理针对 `Application` 类的事件:
如,我们这里定义一个 `AppEvents` 类用于处理针对 `App` 类的事件:

class AppEvents
{
public function boot(Event $event, $application)
public function boot(Event $event, $app)
{
// 导出内部(事件)数据或状态给外部(监听器)调用者
$data = $event->getData();

echo "应用已启动\n";
}

public function finish(Event $event, $application, $extraData)
public function finish(Event $event, $app, $data)
{
echo "应用执行结束\n";
}
Expand All @@ -60,21 +49,21 @@ Soli Event Manager
// 注册事件监听

// 匿名函数
$eventManager->attach('application.boot', function (Event $event, $application) {
$ver = $application::VERSION;
$eventManager->attach('app.boot', function (Event $event, $app) {
$ver = $app::VERSION;
echo "应用已启动 $ver\n";
});

// 对象实例
$eventManager->attach('application.boot', new AppEvents);
$eventManager->attach('app.boot', new AppEvents);

### 聚合事件监听器到专门的事件类中进行处理

上面我们定义了 `AppEvents` 类,其中有两个方法 `boot``finish`
这两个方法可以直接用来监听 `application.boot` 事件和 `application.finish` 事件,
这两个方法可以直接用来监听 `app.boot` 事件和 `app.finish` 事件,
注册方法很简单,如下:

$eventManager->attach('application', new AppEvents);
$eventManager->attach('app', new AppEvents);

这样我们便可以很方便的注册和整理不同维度的不同事件。

Expand All @@ -83,11 +72,11 @@ Soli Event Manager
触发事件调用 `trigger` 方法,其参数为具体的某个事件名称,事件源(当前类),
也可以传入更多整合后的数据,供监听器使用。

$eventManager->trigger('application.boot', $this, $extraData);
$eventManager->trigger('app.boot', $this, $data);

### 事件传播

$eventManager->attach('application.boot', function (Event $event, $application) {
$eventManager->attach('app.boot', function (Event $event, $app) {
// 终止事件传播,这样其他的侦听器就不会再收到此事件通知
$event->stopPropagation();
});
Expand Down
7 changes: 3 additions & 4 deletions phpunit.xml
Expand Up @@ -7,7 +7,6 @@
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
verbose="true"
bootstrap="vendor/autoload.php"
>
Expand All @@ -19,20 +18,20 @@

<testsuites>
<testsuite name="Soli Test Suite">
<directory suffix="Test.php">./tests/</directory>
<directory suffix="Test.php">tests</directory>
</testsuite>
</testsuites>

<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./src/</directory>
<directory suffix=".php">src</directory>
</whitelist>
</filter>

<logging>
<log type="coverage-html" target="build/coverage" lowUpperBound="35" highLowerBound="70"/>
<log type="coverage-clover" target="build/logs/clover.xml"/>
<log type="coverage-crap4j" target="build/logs/crap4j.xml"/>
<log type="junit" target="build/logs/junit.xml" logIncompleteSkipped="false"/>
<log type="junit" target="build/logs/junit.xml"/>
</logging>
</phpunit>
9 changes: 2 additions & 7 deletions src/Events/Event.php
Expand Up @@ -12,12 +12,7 @@
class Event implements EventInterface
{
/**
* 事件名称分隔符
*/
const DELIMITER = '.';

/**
* 完整的事件名称,格式为 "事件空间.事件名称"
* 事件名称
*
* @var string
*/
Expand Down Expand Up @@ -75,7 +70,7 @@ public function getData()

public function setName($name)
{
if (!is_string($name) || !strpos($name, Event::DELIMITER)) {
if (!is_string($name)) {
throw new \InvalidArgumentException('Invalid event type ' . $name);
}
$this->name = $name;
Expand Down

0 comments on commit 1f72f7e

Please sign in to comment.