esemve / hook
适用于Laravel 5.*, 6.*的简单钩子引擎
Requires
- php: >=5.6
- laravel/framework: 5.* || 6.*
This package is auto-updated.
Last update: 2024-09-07 06:24:50 UTC
README
这是什么?
本项目的目的是使您的包能够相互修改,而不需要覆盖源代码。
什么是钩子?
它类似于事件。除非钩子监听器捕获它并命令不执行钩子中的函数,而是执行其他操作,否则由钩子绑定的代码会运行。它们可以按顺序设置,因此您可以在代码中进行多次修改。
它有什么好处?
示例 1:您有一个显示编辑器的模块。在所有情况下,它都使用相同的编辑器。如果将编辑器的显示绑定到钩子上,则可以编写一个可以重新定义/覆盖此钩子的模块,例如将文本区域更改为ckeditor。
示例 2:您列出用户。您可以在钩子中包含每一行的打印。这样,您可以编写一个单独的模块,可以扩展此行以打印电子邮件地址。
示例 3:您将用户数据保存到数据库中。如果这在钩子中执行,则可以编写一个模块,可以添加到用户模型中的额外字段,如"名字"或"姓氏"。为此,您不需要修改处理用户的代码,扩展模块不需要知道主模块的功能。
...还有许多其他事情。如果您正在构建类似CMS的系统,这将使您的工作变得容易得多。
如何安装它?
composer require esemve/hook
修改app.php文件
... 'providers' => [ ... Esemve\Hook\HookServiceProvider::class, ... ], 'aliases' =>[ ... 'Hook' => Esemve\Hook\Facades\Hook::class ... ]
它如何工作?
示例
$user = new User(); $user = Hook::get('fillUser',[$user],function($user){ return $user; });
在这种情况下,抛出了fillUser钩子,它接收$user对象作为参数。如果没有捕获它,则内部函数将返回,因此没有任何操作。但是它可以被提供者中的一个监听器捕获
Hook::listen('fillUser', function ($callback, $output, $user) { if (empty($output)) { $output = $user; } $output->profilImage = ProfilImage::getForUser($user->id); return $output; }, 10);
$callback包含钩子的原始内部函数,因此可以在这里调用它。
可以注册多个监听器到钩子,因此监听器在$output中接收钩子先前注册的监听器的响应。
然后是钩子传递的参数,在这种情况下是用户。
上面的钩子监听器捕获了fillUser的调用,扩展了接收到的对象,并将其返回到其原始位置。钩子运行后,$user对象包含了一个profilImage变量。
示例中的第10号是优先级。它们按顺序执行,因此如果fillUser注册了第5号,它将在第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 作为响应。
工匠
php artisan hook::list
列出所有活动的钩子监听器。
许可证:MIT