asgard/hook

v0.3.1 2016-05-13 11:31 UTC

This package is not auto-updated.

Last update: 2024-09-14 15:16:38 UTC


README

#Hook

Build Status

如果你曾经使用过事件管理器,你会发现Hooks组件非常相似。使用HookManager,你可以创建钩子,在钩子触发时可以附加回调函数来执行。

##安装 如果你正在开发Asgard项目,你不需要安装此库,因为它已经是标准库的一部分。

composer require asgard/hook 0.*

##在Asgard框架中使用

$hm = $container['hooks'];

容器通常可以通过方法参数或通过ContainerAware对象访问。你也可以使用singleton,但不推荐使用。

##在Asgard框架之外使用

$hm = new \Asgard\Hook\HookManager;

##创建钩子

$hm->hook('name_of_hook', function($chain, $param1) {
	// ...
});

第一个参数始终是一个\Asgard\Hook\HooksChain对象。接下来的参数是在触发钩子时传递的。

##触发钩子

$hm->trigger('name_of_hook', [$param]);

如果你想在调用触发时执行自己的函数,请使用最后一个参数

$hm->trigger('name_of_hook', [$param], function($chain, $param) {
	// ...
});

##在钩子前后执行回调函数 要在钩子之前执行函数

$hm->preHook('name_of_hook', function($chain, $param) {
	// ...
});

并在之后

$hm->postHook('name_of_hook', function($chain, $param) {
	// ...
});

##过滤器 当通过引用传递参数时,钩子可以用作过滤器

$hm->hook('name_of_hook', function($chain, &$param) {
	$param = 123;
});
$hm->trigger('name_of_hook', [&$param]);

##HooksChain 对象 链包含钩子中要执行的回调函数。如果一个函数返回一个值,则链停止,并通过触发方法返回该值。

通过调用也可以停止链调用

$chain->stop();

调用停止方法的函数将是最后一个执行的。

要了解在钩子中已执行了多少个函数

$hm->trigger('name_of_hook', [$param], null, $chain);
$count = $chain->executed;

这里提供一个引用来检索链对象及其执行属性。

##HooksContainer HooksContainer是一个包含钩子的类。它扩展了Asgard\Hook\HooksContainer,并包含与注释匹配的钩子方法。

示例

<?php
namespace Bundle\Hooks;

class SomeHooks extends \Asgard\Hook\HooksContainer {
	/**
	 * @Hook("Asgard.Http.Start")
	 */
	public static function start($chain, $request) {
		//do something when HTTP starts processing a request
	}
}

在这里,当触发钩子"Asgard.Http.Start"时,会执行方法start。

如果你在使用Asgard项目,所有HooksContainer都将自动加载到包的Hooks/文件夹中。

如果没有,你可以使用以下方法注册钩子

$annotationsReader = new \Asgard\Hook\AnnotationReader;
$hooks = $annotationsReader->fetchHooks('Bundle\Hooks\SomeHooks');
$hookManager->hooks($hooks);

###贡献

请将所有问题和pull请求提交到asgardphp/asgard存储库。

许可证

Asgard框架是开源软件,许可协议为MIT许可证