hongyukeji/laravel-hook

Laravel中的WordPress过滤器/动作系统

v1.1.0 2020-05-07 13:40 UTC

This package is auto-updated.

Last update: 2024-09-07 23:19:13 UTC


README

Laravel中的动作和过滤器。WordPress风格的。

钩子(因为找不到更好的名字)是一个简单的动作和过滤器(如果你喜欢,也可以说是钩子)系统。

关于

动作是你希望在代码中的某些点上执行的一段代码。动作从不返回任何内容,只是提供了一个钩子,以便在不破坏现有代码的情况下将其连接到现有代码。

过滤器是为了修改实体而设计的。它们总是返回某种类型的值。默认情况下,它们返回它们的第一个参数,你也应该这样做。

了解更多关于过滤器的内容

了解更多关于动作的内容

何时使用钩子?

钩子最好用作允许代码扩展的方式。无论是创建一个包还是应用程序,钩子都可以带来你需要的扩展性。

例如,钩子可以为基于插件/模块的系统打下基础。你可以提供一个“动作”,允许插件注册自己。你可能还会提供一个“过滤器”,以便插件可以更改核心中的数组内容。你甚至可以提供一个“动作”,以便插件可以修改你的应用程序菜单。

钩子的方法并不独特。Laravel提供了可宏化特性行为,允许你“入侵”一个类和事件,以便你可以在代码中的特定点上立即采取行动。

安装

  1. 使用Composer安装
composer require hongyukeji/laravel-hook

如果你使用的是Laravel 5.5或更高版本,你现在可以开始使用这个包了。钩子由Laravel框架自动发现。

  1. 将服务提供者添加到你的 config/app.php 文件中的 providers 数组。
    'Hongyukeji\Hook\HookServiceProvider',
    'Hongyukeji\Hook\HookBladeServiceProvider', 
  1. config/app.php 中添加外观
    'Hook' => Hongyukeji\Hook\Facades\Hooks::class,

使用方法

动作

你可以在代码的任何地方创建一个新的动作,如下所示

Hook::action('my.hook', 'awesome');

第一个参数是钩子的名称;你将在稍后使用这个名称来监听钩子。所有后续参数都将作为参数发送到动作。这些可以是任何你想要的内容。例如,你可能想告诉监听器这被附加到某个模型上。然后你可以将此作为其中一个参数传递。

要监听你的钩子,你需要添加监听器。这些最好添加到你的 AppServiceProviderboot() 方法中。

例如,如果你想要钩入上面的钩子,你可以这样做

Hook::addAction('my.hook', function($what) {
    echo 'You are '. $what;
}, 20, 1);

再次,第一个参数必须是钩子的名称。第二个参数是回调。这可以是闭包、指向应用程序容器中类的字符串(MyNamespace\Http\Listener@myHookListener)、数组回调([$object, 'method'])或全局注册的函数(function_name)。第三个参数是钩子的优先级。数字越低,执行越早。第四个参数指定监听器接受的参数数量。

过滤器

过滤器的工作方式与动作非常相似,结构与动作完全相同。最显著的区别是过滤器总是返回其值。

要添加一个过滤器

$value = Hook::filter('my.hook', 'awesome');

如果没有监听器连接到此钩子,则过滤器将简单地返回 'awesome'

这就是如何在 AppServiceProvider 中添加对此过滤器的监听器的方式

Hook::addFilter('my.hook', function($what) {
    $what = 'not '. $what;
    return $what;
}, 20, 1);

现在,过滤器将返回 'not awesome'。很酷!

你可以将此与前面的钩子一起使用

Hook::addAction('my.hook', function($what) {
    $what = Hook::filter('my.hook', 'awesome');
    echo 'You are '. $what;
});

在Blade中使用

假设你已经将 HookBladeServiceProvider 添加到你的配置中,那么有两个指令可供你在Blade模板中使用。

添加与上面的动作示例相同的动作

@action('my.hook', 'awesome')

添加与上面过滤示例中相同的过滤器

You are @filter('my.hook', 'awesome')