用于 Laravel 5.8 到 9.x 的简单钩子引擎

v1.0.3 2022-02-02 10:23 UTC

This package is auto-updated.

Last update: 2024-09-29 05:49:59 UTC


README

这是为了旧版使用,允许升级到现代包。这部分代码将重新编写以增强功能。

这是什么?

本项目旨在允许你的包之间相互修改,而不必覆盖源代码。

什么是钩子?

它类似于事件。除非钩子监听器捕获它并指示运行钩子中的其他函数,否则被钩子限制的代码会运行。它们可以按顺序设置,这样你就能在代码中进行多次修改。

它有什么好处?

示例 1:你有一个显示编辑器的模块。在这种情况下,编辑器保持不变。如果你在一个钩子中绑定编辑器的显示,那么你可以编写一个模块,该模块可以重新定义/覆盖这个钩子,例如将文本区域更改为 ckeditor。

示例 2:你列出用户。你可以在钩子中包含每行的打印。这样,你可以编写一个独立的模块,它可以向该行添加电子邮件地址打印。

示例 3:你将用户数据保存到数据库中。如果你在钩子中这样做,你可以编写一个模块,该模块可以添加额外的字段到用户模型,如“名字”或“姓氏”。为此,你不需要修改处理用户的代码,扩展模块不需要了解主模块的工作方式。

...还有很多其他事情。如果你正在构建一个类似 CMS 的系统,这将使你的生活更加容易。

如何安装它?

composer require mobi-market/hook

它如何工作?

示例

$user = new User();
$user = Hook::get('fillUser', [$user], function($user){
    return $user;
});

在这种情况下,抛出了一个 fillUser 钩子,它接收 $user 对象作为参数。如果没有捕获它,内部函数,返回 $user 将运行,因此没有任何操作。但可以被提供商的监听器捕获。

Hook::listen('fillUser', function ($callback, $output, $user) {
    if (empty($output))
    {
      $output = $user;
    }
    $output->profileImage = ProfileImage::getForUser($user->id);
    return $output;
}, 10);

$callback 包含钩子的原始内部函数,因此可以在这里调用。

可以注册多个监听器到钩子,因此监听器在 $output 中接收钩子之前注册的监听器的响应。

然后是钩子传递的参数,在这种情况下是用户。

上面的钩子监听器捕获了 fillUser 的调用,扩展了接收到的对象,并将其返回到原来的位置。钩子运行后,$user 对象包含一个 profileImage 变量。

示例中的第 10 项是优先级。它们按顺序执行,因此如果将数字 5 也注册到 fillUser,它将在数字 10 之前运行。

初始输出

您还可以将初始输出传递给监听器。

$initialOutput='test string';

\Hook::get('testing',['other string'],function($otherString){
    return $otherString;
},$initialOutput)

// and later ...

Hook::listen('testing', function ($callback, $output, $otherString) {
    if ($output==='test string') {
        $output="{$output} yeeeaaaayyy!";
    }
    if ($otherString==='other_string') {
        // other string is good too
    }
    return $output; // 'test string yeeeaaaayyy!'
});

如果没有监听器,将返回 'other string'。

在 blade 模板中使用

@hook('hookName')

在这种情况下,钩子监听器可以像这样捕获它

 Hook::listen('template.hookName', function ($callback, $output, $variables) {
   return view('test.button');
 });

在 $variables 变量中,它接收所有可用于 blade 模板的变量。

为了监听 blade 模板,您需要监听 template.hookName 而不是仅仅 hookName

包装 HTML

@hook('hookName', true)
    this content can be modified with dom parsers
    you can inject some html here
@endhook

现在,$output 参数包含由钩子组件包装的 HTML。

Hook::listen('template.hookName', function ($callback, $output, $variables) {
  return "<div class=\"alert alert-success\">$output</div>";
});

停止

Hook::stop();

将停止放入钩子监听器将停止运行注册到该钩子的其他监听器。

用于测试

Hook::mock('hookName','returnValue');

之后,hookName 钩子将返回 returnValue 作为响应。

Artisan

php artisan hook:list

列出所有活动的钩子监听器。

许可证:MIT