pikart/laravel-hooks

为Laravel设计的简单钩子系统

v0.1.0 2018-11-26 14:54 UTC

This package is auto-updated.

Last update: 2024-09-14 19:04:17 UTC


README

需求

php >= 7.2
laravel >= 5.7

使用composer安装此包。

composer require pikart/laravel-hooks  

此包将自动使用Laravel自动发现功能注册服务提供者和别名。

使用发布命令将包配置复制到本地配置

php artisan vendor:publish --provider="Pikart\LaravelHooks\HookServiceProvider"

用法

注册钩子

注册方法接受三个参数

  1. 合同 (字符串) 必需的
    自定义字符串或现有接口名称

  2. 钩子 (字符串|闭包|Pikart\LaravelHook\Contracts\Hook) 必需的

    如果合同是现有接口,则钩子必须是现有类名称或类实例。
    注册的类必须实现两个接口。它相关的接口和
    钩子接口(Pikart\LaravelHook\Contracts\Hook)。

    如果钩子是现有类名称,则将使用Laravel服务容器解析类,
    因此它可以在构造函数中使用自动实例注入。

  3. 优先级 (整数) 默认 0
    按顺序执行注册的钩子,值越大越先执行。

注册闭包

HookManager::register('hook_name', function( array $args ) {   
    return 'Hello world';  
}, 10);  

注册类

HookManager::register('hook_name', SomeHookClass::class, 10);  

注册实例

HookManager::register('hook_name', new SomeHookClass::class, 10);  

注册接口到实现

HookManager::register(SomeHookInterface::class, SomeHookClass::class, 10);  

执行

钩子通过钩子方法执行。钩子方法接受两个参数

  1. 钩子名称 (字符串) 必需的
    自定义字符串或现有接口名称
  2. 参数 (数组)
  3. 方法 (字符串)

参数用于执行,如果存在类名称,则
使用Laravel服务容器创建其实例

通过自定义名称执行钩子

$output = HookManager::hook('hook_name');  

通过自定义名称和参数执行钩子

$user = User::find(1);  
  
$output = HookManager::hook('hook_name', [  
 'user' => $user]);  

通过接口执行钩子

$output = HookManager::hook(SomeHookInterface::class);  

通过接口名称和参数执行钩子

$user = User::find(1);  
  
$output = HookManager::hook(SomeHookInterface::class, [  
 'user' => $user]);  

通过接口名称和参数以及自定义方法执行钩子

$user = User::find(1);  
  
$output = HookManager::hook(SomeHookInterface::class, [  
 'user' => $user], 'someMethod');  

获取要执行的钩子

get方法接受三个参数

  1. 钩子名称 (字符串) 必需的 自定义字符串或现有接口名称
  2. 参数 (数组)

get方法与hook方法的工作方式相同,但是不执行钩子,返回数组。

获取准备好的钩子

$hooks = HookManager::get(SomeHookInterface::class);  

获取带有参数的准备好的钩子

$hooks = HookManager::get(SomeHookInterface::class, [
    'user' => $user
]);  

获取原始钩子

$hooks = HookManager::getRaw(SomeHookInterface::class);  

测试

 vendor/bin/phpunit --testdox