asgard / hook
v0.3.1
2016-05-13 11:31 UTC
Requires
- php: >=5.5.9
- asgard/container: ~0.3.0
- doctrine/annotations: ^1.0
- jeremeamia/superclosure: ^2.0
Suggests
- asgard/cache: ~0.3.0
This package is not auto-updated.
Last update: 2024-09-14 15:16:38 UTC
README
#Hook
如果你曾经使用过事件管理器,你会发现Hooks组件非常相似。使用HookManager,你可以创建钩子,在钩子触发时可以附加回调函数来执行。
##安装 如果你正在开发Asgard项目,你不需要安装此库,因为它已经是标准库的一部分。
composer require asgard/hook 0.*
$hm = $container['hooks'];
容器通常可以通过方法参数或通过ContainerAware对象访问。你也可以使用singleton,但不推荐使用。
$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许可证