yaf (六脉神剑) 六脉神剑,并非真剑,乃是以一阳指的指力化作剑气,有质无形,可称无形气剑。
laravel (降龙十八掌) 降龙十八掌天下第一,本身掌法套路就刚猛无比,在加上使用者雄浑的内力,更是无可抵挡
yaf 脉络清晰;框架简洁,易上手;可随心扩展自有功能;由于框架使用扩展形式,所以执行效率更高。
laravel 框架代码优美,整洁,周边丰富,可扩展性强;但框架可读性较差,每次运行加载文件较重,影响执行效率。
故优势互补,以yaf为底,laravel IOC容器思想、中间件、服务注册等贯穿整个yaf生命周期中,使yaf框架 可以更易扩展,代码也更清晰。
本版本为V1.0版,还未经过实际项目校验,如有使用中出现问题,可以发送邮件到[email protected]中
共同探讨,如果有更好的想法或者优化也欢迎发送邮件互相切磋讨论,多多益善。
- 容器(Container)
基于pimple/pimple的容器,贯穿于yaf的全生命周期流程中,index.php入口文件会实例化容器并注册到Yaf_Registry实例中, 以实现全局使用。
$app = new Application([], realpath(dirname(__FILE__)));
Yaf_Registry::set('app', $app);
- 服务注册(ServiceProvider)
同样基于pimple/pimple容器,当需要新的中间件,或者新增服务模块时,可以使用服务注册将服务或者中间件注册。
$app = new Application([], realpath(dirname(__FILE__)));
Yaf_Registry::set('app', $app);
app()['request'] = function ($c) {
return new Request('test/test', 'base_uri/test/test');
};
app()[Authenticate::class] = function ($c) {
return new Authenticate();
};
- 中间件(Middleware)
在整个请求流程的生命周期中,会有一些鉴权、加解密、路由校验、session等中间件在请求到达核心逻辑之前做一些过滤请求 的处理,当有新增或者修改、删除一些过滤逻辑的时候可以在相应的配置文件中修改,做到随意扩展。
$app = new Application([], realpath(dirname(__FILE__)));
\Yaf_Registry::set('app', $app);
app()['request'] = function ($c) {
$request = new Request('test/test', 'base_uri/test/test');
$request->setShouldMethod('any');
$request->setMiddleware(['auth']);
$request->setParam('api_token','12345678');
return $request;
};
app()[Kernel::class] = function ($c) {
return new Kernel($c);
};
arrayConfig()->set('auth', require __DIR__ . '/../src/Auth/config/auth.php');
$res = app(Kernel::class)->handle(app('request'));
var_dump(Auth()->id());
var_dump(Auth()->user());
*核心(Kernel)
当各个组件、Request、Reponse等注册到服务容器中以后,kernel使用管道顺序调用Middleware 作相应的请求处理。
if ($middlewareList = $request->getMiddleware()) {
collect($middlewareList)->map(function ($middleware) {
$this->middleware[] = $middleware;
});
}
return (new Pipeline($this->app))
->send($request)
->through($this->middleware)
->then(function ($request) {
return $request;
});
*输入/输出(Request/Response)
request和response继承yaf自带的request/response 新增一些必要的数据。一并注册到容器中。
$app = new Application([], realpath(dirname(__FILE__)));
Yaf_Registry::set('app', $app);
app()['request'] = function ($c) {
return new Request('cli', 'cli');
};
*校验器(validation)
参考laravel的校验器来做参数的校验,但校验类型与laravel相比较少,具体读源码
validator()->validate([
'age' => 'required|int|between:1,100',
'name' => 'required|string'
]);
$age = request()->getParam('age');
$name = request()->getParam('name', 'test');
var_dump($age);
var_dump($name);
*日志(monolog)
完全复用monolog来做为此版本的日志记录工具,以天为单位,每小时记录所有的请求日志,具体代码需要根据实际 项目去配置,本处不做过多讲解。
date_default_timezone_set("PRC");
$app = new Application([], realpath(dirname(__FILE__)));
Yaf_Registry::set('app', $app);
app()['request'] = function ($c) {
return new Request('cli', 'cli');
};
(new ServiceProvider())->boot();
Log::debug('debug log');
Log::info('info log');
Log::notice('notice log');
Log::error('error log');
Log::warning('warring log');