blinkinglight / 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 not auto-updated.
Last update: 2024-09-27 03:27:04 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\Hook::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')