hongyukeji / laravel-hook
Laravel中的WordPress过滤器/动作系统
Requires
- php: >=7.0
- illuminate/support: >=5.3
- jeremeamia/superclosure: ^2.4
Requires (Dev)
- phpunit/phpunit: ^6.0
This package is auto-updated.
Last update: 2024-09-07 23:19:13 UTC
README
Laravel中的动作和过滤器。WordPress风格的。
钩子(因为找不到更好的名字)是一个简单的动作和过滤器(如果你喜欢,也可以说是钩子)系统。
关于
动作是你希望在代码中的某些点上执行的一段代码。动作从不返回任何内容,只是提供了一个钩子,以便在不破坏现有代码的情况下将其连接到现有代码。
过滤器是为了修改实体而设计的。它们总是返回某种类型的值。默认情况下,它们返回它们的第一个参数,你也应该这样做。
何时使用钩子?
钩子最好用作允许代码扩展的方式。无论是创建一个包还是应用程序,钩子都可以带来你需要的扩展性。
例如,钩子可以为基于插件/模块的系统打下基础。你可以提供一个“动作”,允许插件注册自己。你可能还会提供一个“过滤器”,以便插件可以更改核心中的数组内容。你甚至可以提供一个“动作”,以便插件可以修改你的应用程序菜单。
钩子的方法并不独特。Laravel提供了可宏化特性行为,允许你“入侵”一个类和事件,以便你可以在代码中的特定点上立即采取行动。
安装
- 使用Composer安装
composer require hongyukeji/laravel-hook
如果你使用的是Laravel 5.5或更高版本,你现在可以开始使用这个包了。钩子由Laravel框架自动发现。
- 将服务提供者添加到你的
config/app.php
文件中的 providers 数组。
'Hongyukeji\Hook\HookServiceProvider', 'Hongyukeji\Hook\HookBladeServiceProvider',
- 在
config/app.php
中添加外观
'Hook' => Hongyukeji\Hook\Facades\Hooks::class,
使用方法
动作
你可以在代码的任何地方创建一个新的动作,如下所示
Hook::action('my.hook', 'awesome');
第一个参数是钩子的名称;你将在稍后使用这个名称来监听钩子。所有后续参数都将作为参数发送到动作。这些可以是任何你想要的内容。例如,你可能想告诉监听器这被附加到某个模型上。然后你可以将此作为其中一个参数传递。
要监听你的钩子,你需要添加监听器。这些最好添加到你的 AppServiceProvider
的 boot()
方法中。
例如,如果你想要钩入上面的钩子,你可以这样做
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')