插件开发手册

钩子

最近更新:6个月前

钩子的作用主要是在系统执行到某个点的时候,进行切面操作

整个系统有四个钩子

  • app.init 系统初始化
  • app.start 路由完成,已经知道当前请求的目标(插件,控制器)
  • app.start@包 例如app.start@plugin.demo
  • app.end@包 例如app.end@plugin.demo
  • app.end 执行完毕

钩子会自动载入包对应文件夹下的所有文件,如下:

  • /hook/钩子名/**.php
  • /所有安装了的包/src/hook/钩子名/**.php

可以跨包操作

例如在plugin/demo包下面配置钩子/hook/app.start@plugin.demo/foo.php,/hook/app.start@plugin.demo/bar.php文件夹,在文件加下的文件就会在plugin/demo包执行的时候引入上述两个文件

常见的使用场景如下:

  • 设置模板路径,做主题包
  • 对其他包做插件
  • ...

钩子示例

记录全局请求日志 /hook/app.init/log.php

use Ebcms\App;
use Ebcms\Container;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
use Psr\Log\LoggerInterface;

App::getInstance()->execute(function (
    Container $container,
    App $app
) {
    $container->set(LoggerInterface::class, function () use ($app): LoggerInterface {
        $log = new Logger($_SERVER['HTTP_HOST']);
        $log->pushHandler(new StreamHandler($app->getAppPath() . '/runtime/log/' . date('Y-m-d') . '/debug.log', Logger::DEBUG));
        return $log;
    });
    $container->get(LoggerInterface::class)->debug($_SERVER['REQUEST_METHOD'] . ':' . $_SERVER['REQUEST_URI'], [$_POST, $_GET]);
});

plugin/demo包自定义函数 /hook/app.start@plugin.demo/functions.php

function test(): array
{
    return [];
}

plugin/demo包注入中间件 /hook/app.start@plugin.demo/middleware_reg.php

use Ebcms\App;
use Ebcms\RequestHandler;

App::getInstance()->execute(function (
    RequestHandler $requestHandler,
    App $app
) {
    $requestHandler->lazyMiddleware(SomeMiddleware::class);
});

...还有很多,这里就不一一列举。


Powered By EBCMS