1. 文章
  2. 文章详情

2019 年全新堆积木式php7.2 框架—Lin

Lin是一款全新的php框架,基于php7.2,采用apache2.0开源协议,有以下创新点:

主要创新有:

  • 全组件化(堆积木式开发)
    • 所谓全组件化就是,框架自身没有任何必须的执行核心,它就是一个壳子,所有运行都基于一个个组件堆积而成,并且这些组件之间还没有直接耦合。比如做API,你可以只选择路由组件,其余一律不要,那么框架就只执行路由。更极端一点,你可以什么组件都不要,那么框架就变成了传统的php原生开发,只不过给你归档了目录和编码规范。
  • 全新架构LBA
    • LBA全称Layer、Block、Affix,中文名也可以叫层、块、摆件,关于这个架构的具体说明请点击查看,像MVC、MVVC、MVVM等等都是该架构的一个特例。
  • basement规范
    • 这个规范是我专门开发的一套独立的项目、该项目用于解决组件调用、依赖注入、规范化开发、组件通用、解耦化、组件透明化等一系列开发问题,该项目的具体说明,也请移步点击查看

次要创新主要有如下几点:

  • 自带本地文件模拟的kvqueue服务器,无需安装如memcache和redis等第三方软件即可使用。我在自己四核单机上模拟kv服务器连续1000次setget仅需70ms(第一次使用会创建一个大索引文件,较为耗时,之后无此消耗),作为对比使用memcached则需要180ms。并且这两个模拟服务器都支持并发,在并发测试下数据未出现错误。
  • 原生透明化支持SQL、Key-Value、Queue等服务器主从、多节点访问。服务器只需在配置里面设置即可,而使用过程对用户是全透明的,会自动按照配置的权重和类型选择相应的服务器进行操作。
  • 全新的对称加密算法Lin Symmetric(Secure) Encryption,简称LSE。该算法具有数据量低(密文只比原文数据多16个字节,最少16字节)、安全性强、执行快(连续100次加密解密1k字节数据只需200ms)、对秘钥无任何限制,并且同一个秘钥情况下,每一次加密同一内容生成的密文都不同,解密时却都能解出唯一原文。
  • 重新定义的ORM关系模型概念、和生成任意复杂sql语句的构建器。关系模型中支持宏(对一系列操作进行展开)、数据自动格式化器(入库和出库自动执行),并且关联模型被简化为主从模型的概念,让繁杂的关联模型定义变得极其简单,一行代码就可以实现任意关联模型,如远程、n对n关联等。具体介绍请点击查看。超强的sql语句构建器,你可以构建任意复杂的sql语句(仅限增删改查),如各种嵌套子句和各种带任意括号的复杂条件。
  • 流程自动控制。在分层应用中,往往要书写大量判断代码,以选择执行不同的内容。如先去缓存查看,若无缓存再调用数据库,再写缓存这种流程。使用流程自动控制,无需大量的if-else和判断语句,会自动帮你判断选择不同的代码执行。具体介绍请点击查看
  • 精简和更为抽象的安全概念。在传统安全领域、授权、认证、登录、单点登录、RBAC、OAuth2、验证码、防csrf等,每一个都需要大量代码实现。但是使用Lin提供的安全类,你只需关注两行代码就可以搞定以上所有东西。新的安全概念被抽象为:客户端、临时客户端、场景创建、场景校验四块,这四者的任意组合即可实现上述的功能。具体介绍请点击查看
  • 视图模板中的静态化。视图模板除具备传统视图引擎的继承、包含外,还有一个静态化的概念。即将模板语法编译成的php代码再次变为html代码,并且你可以在模板页面任何地方执行静态化,没有任何限制。

除以上这些创新外,还有很多小的亮点

路由可缓存闭包,支持模板化的json和xml响应,透明化的生成任意风格的url扩展了传统异常类以解决不易管理多个不同异常类的问题、更为简洁的事件机制和灵活的语言映射等。


关于benchmarks

请第三方来做。但由于Lin是全组件化的,框架、组件、应用是三重分离,我可以在框架里不使用任何组件,这样测试的结果基本就等于测试原生php,所以得根据具体情况来做(如是否使用session、事件、调试等)。


详细举例说明

1.框架层与应用层零耦合

采用全组件化开发,不存在任何全局变量、全局函数和必须常量,所有功能都是由一个个组件(类)提供,并且这些组件之间没有直接耦合。框架的启动流程完全由用户自行定义,开发时只需将一个个组件堆积起来即可,更加灵活多样。

  • 启动示例

2019 年全新堆积木式php7.2 框架——Lin

2.无额外的框架语法

没有框架专属语法,避免过度设计。所有接口设计或命名都以极简主义为宗旨,简单稳定并且风格一致,让用户只关注于功能调用。如视图模板中,仅以简化php标签为主,其模板语法依旧是php原生语法。

视图示例 

模板语法和php原生保持一致,但精简了标签,模板界定符“{ }”还可任意指定。如使用“{{ }}”或“< >”也可。
<html>
    {foreach ($array as $k=>$v)}
        <p>{:v}p>
    {/foreach}
html>

3.概念清晰简单

对于一个复杂的应用,需要许多复杂的抽象概念才能胜任。但复杂的概念往往需要大量的代码去实现,如安全验证关系模型等。Lin重新抽象了这些概念,将高度抽象的概念隐藏于内部,而外部调用极尽简洁。

  • 安全功能示例
$Security = New Security

//建立一个名为csrf的场景,场景名可随意指定
$token = Security::build('csrf');
//校验,用于防csrf
$valid = $Security->check('csrf', $token);

//建立一个名为login的场景,侧重校验该场景是否存在
Security::withToken('1')->build('login', 1200);
//校验,用于检测登录与否
$valid = $Security->check('login', 1);
  • ORM示例
class Users extends linormmodelModel
{
    //设置参数,setting方法用于替代构造函数,在实例化时自动执行
    protected function setting()
    {
        //设置主键和表名
        $this->setPK('user_id')->setTable('users');

        //设置格式化器
        $this->setFormatter('read', function ($Model) {
            $Model['content'] = json_decode($Model['content']);
            return $Model; //定义一个格式化器read,将模型的content字段解码。
        });

        //设置宏,可实现简化操作和映射操作
        $this->setMacro('delete', function($Map){
            return $Map->update('status', 0); //将原有的delete方法映射为更新,实现软删除
        });

        //设置关联模型
        $this->setRelation('order', [
            'class' => 'Orders', //关联的从模型类名
            'mk' =>'order_id', //主模型(Users)的关联主字段
            'sk' =>'id', //从模型(Orders)的关联从字段
        ]);
    }
}

4.功能涵盖广、整合度高

Lin提供了当前web开发中常用的功能(多达30种),并且将很多交叉重复的地方进行了分离和整合。如对将数据处理拆分为数据映射数据格式化,使得数据处理更加规范;而将登录、认证、权限等安全相关功能高度整合到安全类中,使其概念和调用都更为简单。

  • 数据映射示例
//定义
class MyMapper extends Mapper
{
    protected function setting()
    {
        //定义一个名为my_rule的映射规则
        $this->setRule('my_rule', [
            'id: must' => 'user.id',             //must模式,强制将$raw['id']映射为$raw['user']['id']
            'email: should' => 'user.email',    //should模式,$raw['email']存在时,映射为$raw['user']['email']
            'opt.info: may' => 'user.info',    //may模式,$raw['opt']['info']存在且非空时,映射为$raw['user']['info']
        ]);
    }
}

//调用
$Mapper = new MyMapper;
$data = $Mapper->withRule('my_rule')->map($raw);
  • 数据格式化示例
//定义
class MyFormatter extends linprocessorFormatter
{
    protected function setting()
    {
        //定义一个名为my_rule的格式化规则
        $this->setRule('my_rule', [
            'id: must' => 'toInt',             //must模式,强制将$raw['id']格式化为整数
            'price: should' => 'toPrice',     //should模式,$raw['price']存在时,格式化两位小数
            'opt.info: may' => 'num2IP',     //may模式,$raw['opt']['info']存在且非空时,将其json序列化
        ]);
    }
}

//调用
$Formatter = new MyFormatter;
$data = $Formatter->withRule('my_rule')->format($raw);

5.全新架构LBA更加确保开发规范

Lin一方面高度灵活,但另一方面也提供了一套约束机制,用于确保开发规范和后期维护。全新的架构LBA(Layer、Block、Affix)(点击查看具体介绍)用于替代传统的MVC架构,使应用架构更加弹性化、规范化、灵活化,无论升级和后期维护都轻松自如。

6.通用化组件和依赖注入

为使得组件可以灵活调用和替代,并解决组件在不同框架之间的流动性问题,作者专门为此开发了一套全新的php组件通用化项目basement(点击查看具体介绍)。basement将组件依赖和调用规范化、简单化、透明化,为解耦开发、组件调用提供了强大保障。

  • basement分为注册和调用两步,皆通过名为Linker的类来完成。
//注册日志组件
Linker::register([
    'Log' => 'linbasementlogLog',
]);

//使用
$Log = Linker::Log(true); //获得实例
$Log->setName('log_name'); //设置当前日志名
$Log->getName(); //获得当前日志名


$Log->info('content'); //记录日志,psr-3方式
...                    //8个日志等级,参见psr-3
$Log->alert('content');


$Log->record('content', 'type'); //自定义日志类型

7.提供KVQueue的本地模拟服务器

作者使用原生php自行开发了一个基于本地文件的轻量化kv和queue服务,这两者具有快速、准确、数据小、无依赖项等特点,开发中无需安装redis、memcached等服务器软件也可以实现缓存和队列等应用功能。两者都遵循basement规范,可在生产环境中一键切换。对于无法安装第三方软件的虚拟机而言,是一个福音。

  • KV示例
//通过basement注册和调用
Linker::register([
    'ServerKV' => 'lin\basement\server\kv\KVLocal',
]);

//使用
$Server = Linker::ServerKV(true); //获得实例
$Server->set('key', $value); //设置键值
$Server->get('key'); //获得键值
$Server->delete('key'); //删除键值
$Server->exists('key'); //键值是否存在
$Server->flush(); //清空所有键值

8.结构精简清爽

Lin的目录结构简单,没有繁杂的目录和文件,能将不同功能、用途的代码很好的归类,让用户对应用结构清晰明了,使得团队开发可以更好的分工和合作


9.Lin还有许多其他优点和新特效,都等着你来发现


安装和使用

  • 使用composer命令
composer create-project lin/lin
  • 或下载压缩包:

lin-1.0.0.zip​downloads.lin-php.com


官方网站:

图标

详细文档:

简介 - Lin文档​docs.lin-php.com

参考:https://zhuanlan.zhihu.com/p/56006703

发表评论

登录后才能评论

评论列表(0条)