Giter Site home page Giter Site logo

lazyphp4's Introduction

LazyPHP4.6

[TOC]

更新日志

  • 2020.12.28 调整目录结构,添加安装和开发命令(robo.li)

4.6 版本

  • flightphp 更新
  • 文档生成部分修正引用jquery时cdn失效的问题
  • 方法头注释解析支持行尾空白格
  • 添加 Nette Database Core ,通过 ndb() 方法全局引用,使用说明见 https://doc.nette.org/en/3.0/database-core
  • 添加 robo 文件,支持安装、启动测试环境的命令

LazyPHP3、LazyPHP4和LazyPHP4.5

先介绍下LazyPHP各个版本的关系。LazyPHP一直是我的自用框架,所以很大程序上它都是随着我所认为的开发趋势一步步演进的。

LP3形成于新浪云时期,它专注于降低学习成本。通过反向封装面向对象为函数接口,甚至能帮助不了解面向对象的程序员写出强壮的程序。因为逻辑的简单性,在SAE相关项目上大量使用。

LP4则是我创业后为JobDeer相关项目的需求而设计的版本。作为一家移动互联网时代的创业公司,我们需要通过一套框架来支持网站和客户端。LP3还停留在ajax渲染的时代,所以我面向API对LP进行了重新设计。

以下是LP4的特性:

为API设计

在古代,PHP通常被视为HTML和Data之间的胶水,用来渲染和输出页面。当手机成为人类身体的一部分后,我们发现几乎所有的网站、产品都不可避免的遇到一个需求:多平台整合。

API先行

如果说响应式布局还能在不同大小的浏览器上为混合式编程挽回一点局面的话,在现在这个APP风行的年代,为了兼容各种客户端(iOS、Android、电视、平板、汽车、手表),业务数据必须变成API接口。MVC的模式变异了,M被彻底分离为接口。PHP未来的核心,将是处理API。

相关功能

LP4就是在这样一个背景下设计的,所以比起3,它增加了很多API相关的功能

  • 整合flight,用于处理RestFul请求。
  • controller支持函数注释,可用于指定路由、验证输入参数、生成交互式文档
  • 为了能自动调整路由,提供了编译工具_build.php,用于生成meta文件和路由代码

具体起来呢,就这样:

<?php
    /**
     * 文档分段信息
     * @ApiDescription(section="User", description="查看用户详细信息")
     * @ApiLazyRoute(uri="/user(/@id:[0-9]+",method="GET") 
     * @ApiParams(name="id", type="int", nullable=false, description="Uid", check="i|check_not_empty", cnname="用户ID")
     * @ApiReturn(type="object", sample="{'id':123}")
     */
    public function info($id)
    {
        if( !$user = db()->getData( "SELECT * FROM `user` WHERE `id` =:id LIMIT 1" , $id )->toLine() )
            throw new \Lazyphp\core\DataException("UID 对应的用户数据不存在");
        return send_result( $user );
    }
?>    

路由、输入检查和文档全部在注释中搞定,是不是很方便。

LP4的注释标记完全兼容php-apidoc,但是扩展了两个标记。

@ApiLazyRoute ( 新增

指定方法对应的路由。method和uri部分都遵守flightPHP的语法。LP做的事情只是把它拼接起来。

@ApiParams ( 扩展

添加了 check和cnname两个属性,用来为参数指定检查函数,以及提供字段的中文解释(在错误提示时有用),如果不需要可以不写。

注意:文档生成已经默认整合到编译工具_build.php中了,生成好的文档在docs目录下。

规范化

  • 引入了namespace和异常处理
  • 整合了PHPUnit和Behat测试框架
  • 整合了Composer,支持自动加载
  • 整合了Phinx,可对数据库版本进行管理

自动化

  • 整合LazyRest,通过可视化界面生成常规的接口代码(TODO)

手册和规范

安装

测试环境需要composer才能运行

安装composer

$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer

安装LP4依赖

$ cd where/lp4/root
$ composer install

运行

如果你在不可写的环境(比如SAE)运行LP4,请在上传代码前运行 php _build.php 来生成自动路由。

迅捷函数

  • function t( $str ) // trim
  • function u( $str ) // urlencode
  • function i( $str ) // intval
  • function z( $str ) // strip_tags
  • function v( $str ) // $_REQUEST[$str]
  • function g( $str ) // $GLOBALS[$str]
  • function ne( $str ) // not emptyy
  • function dlog($log) // 打印日志到文件

状态函数

  • function is_devmode() // 开发模式
  • function on_sae() // 是否运行于SAE

数据库相关函数

  • function s( $str ) // escape
  • function db() // 返回数据库对象
  • function get_data( $sql ) // 根据SQL返回数组
  • function get_line( $sql ) // 根据SQL返回单行数据
  • function get_var( $sql ) // 根据SQL返回值
  • function run_sql( $sql ) // 运行SQL

由于LP4在框架外层做了catch,所以数据库异常会被拦截,并以json格式输出。

LP4还提供了对象方式的数据库操作,返回结果更可控。

<?php
    db()->getData('SELECT * FROM `user`')->toArray(); // 返回数组 
    db()->getData('SELECT * FROM `user` WHERE `id` = :id' , $id )->toLine(); // 返回数组中的一行,参数绑定模式 
    db()->getData('SELECT COUNT(*) FROM `user`')->toVar(); // 返回具体数值 
    db()->getData('SELECT * FROM `user`')->toIndexedArray('id'); // 返回以ID字段为Key的数组 
    db()->getData('SELECT * FROM `user`')->toColumn('id'); // 返回ID字段值的一维数组 
?>

LDO

其实LP4还提供了一个针对表进行数据查询的对象 LDO , 首先从数据表new一个Ldo对象,然后就可以用getXXX语法来查询了。因为支持Limit以后,我实在没搞定正则,所以现在还有ByNothing这种奇葩结构。

嘛,在做简单查询时很好用,getAllById这样的。

<?php
// 根据查询的函数名称自动生成查询语句
$member = new \Lazyphp\Core\Ldo('member');
$member->getAllById('1')->toLine();
$member->getNameById('1')->toVar();
$member->getDataById(array('name','avatar') , 1)->toLine();
$member->getAllByArray(array('name'=>'easy'))->toLine();  
$member->findNameByNothing()->col('name');
$member->findNameByNothingLimit(array(2,5))->col('name'); 

?>

Controller

和之前的版本一样,LP依然使用controller作为主入口。但访问路径从?a=&c=改为路由指定,因此,访问路径和controller名称以及method名称将不再有任何关联。 换句话说,你可以随意指定controller名称以及method名称,但注意其注释中的route不要重复,否则产生覆盖。

错误处理

在处理逻辑出错时可以直接抛出异常。 自带以下几类

<?php
$GLOBALS['rest_errors']['ROUTE'] = array( 'code' => '10000' , 'message' => 'route error' );
$GLOBALS['rest_errors']['INPUT'] = array( 'code' => '10001' , 'message' => 'input error' );
$GLOBALS['rest_errors']['DATABASE'] = array( 'code' => '30001' , 'message' => 'database error' );
$GLOBALS['rest_errors']['DATA'] = array( 'code' => '40001' , 'message' => 'data error' );
?>

可在 _lp/lib/functions.php 文件尾部追加自己的错误类型。比如我们来添加一个时间异常。

第一步追加定义

<?php
$GLOBALS['rest_errors']['TIME'] = array( 'code' => '888888' , 'message' => 'time system error' );
?>

然后就可以在controller的方法中抛出了

<?php
    public function abc()
    {
        if( true ) throw new \Lazyphp\core\timeException("这里填写具体的错误信息");
    }
?>

LazyPHP4.5

LazyPHP4.5是LazyPHP4之上的一个版本,它将LazyPHP3的模板系统重新加了回来。之所以有这个版本,是因为我发现做一些小项目时,我们并不需要那么纯粹的API和客户端分离。毕竟全平台应用会消耗大量的时间,很多活动页面和MVP直接用PHP模板渲染来得更快。

当然,我可以用回LP3.1,但是用惯了LP4中的一些功能后,就各种回不去了。这不是正好有点时间么,所以顺手给LP4加上了模板系统。

LP4.5的修改

LP4易用性优化

异常配置分离成独立文件

在LP4中,定义错误类型时,我们需要去 _lp/lib/functions.php 文件尾部追加自己的错误类型。LP4.5中,将这部分直接分离成了配置文件,直接修改 /config/exception.php 即可。

添加默认页面和默认路由

LP4对新手有个大坑,就是配置完全正确时,访问根目录会提示404。这是因为演示用路由是 /demo/times/ ,所以访问根目录404是正确的。

为了不让大家再次掉到坑里去,LP4.5中添加了根目录的演示页面。

将配置文件中的自动编译打开,方便调试

LP4刚安装完时每次修改完代码都要运行 php _build.php 才能生效,这是因为配置文件中的开关默认关了。考虑到刚装完必然是要进行开发调试,LP4.5将其默认打开了。

$GLOBALS['lpconfig']['buildeverytime'] = true;

模板系统的引入

LP4.5引入了之前LP3的模板系统,但是又不完全一样,所以这一段请大家仔细读读。

智能渲染

LP4.5引入了智能渲染的概念,简单的说,就是同一个页面,你要JSON我就按JSON渲染;你要Ajax我就按Ajax渲染;你要Web页面我就按Web来渲染。

具体的判断是根据请求头来识别的,不多说直接上代码:

function is_ajax_request()
{
    $headers = apache_request_headers();
    return (isset( $headers['X-Requested-With'] ) && ( $headers['X-Requested-With'] == 'XMLHttpRequest' )) || (isset( $headers['x-requested-with'] ) && ($headers['x-requested-with'] == 'XMLHttpRequest' ));
}

function is_json_request()
{
    $headers = apache_request_headers();
    return (isset( $headers['Content-Type'] ) && ( clean_header($headers['Content-Type']) == 'application/json' ));
}

这样会带来一个非常大的好处,就是我们的API接口和Web页面完全统一起来了,不用再为API写专门的代码了。

同时这也会带来一个潜在的安全大坑,因为以前我们用render去处理$data时,是在服务器端渲染的;而现在API和Web统一后,很多信息会通过JSON显示出来。类似对User表SELECT *,然后把密码吐出来这种事千万不要去做。

模板目录

目录变更

模板目录还是view,但下边直接就是具体的Layout类型了,去掉了之前多余的layout目录。

模板文件路径和扩展名变更
  • 模板文件名从原来的 $controller/$action.tpl.html ,改成了 $controller_$action.tpl.php ,主要是为了减少目录层级。
  • 注意模板文件后缀从 *.tpl.html 改为了 *.tpl.php ,主要是为了代码高亮和防泄漏。
静态文件目录变更

静态文件从static目录改放到了assets目录。

模板内的数组格式变更

因为使用模板直接渲染JSON对应的格式,所以多了一个data的维度。举个例子: 之前

$data['title'] = 'hi';
render( $data );

在模板里边直接用 $title就好。

现在

$data['title'] = 'hi';
send_result( $data );

在模板里边需要写成 $data['title']。因为send_result函数里,我们又包了一层:

function send_result( $data , $force_json = false )
{
    $ret['code'] = 0 ;
    $ret['message'] = '' ;
    $ret['data'] = $data ;
    
    if( is_json_request() || $force_json )
        return send_json( $ret );
    elseif( is_ajax_request() )
        return render_ajax( $ret , 'default' );
    else 
        return render_web( $ret , 'default' );
}
其他调整
  • 默认的Web布局从原来的两栏改为单栏。
  • 更新Bootstrap到最新稳定版本3.3,同时还内置了Start Bootstrap的 Stylish Portfolio 模板,它是一个带侧栏菜单的Responsive模板,如果是给APP做Landing Page基本上直接改文字就可以了。
  • 当然,国外的模板直接用不了的,所以还接地气的对CDN做了本土化,顺手把默认的背景图换成萌妹子了。

lazyphp4's People

Contributors

easychen avatar liudeing avatar yangweijie avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lazyphp4's Issues

路由不能工作

你好,安装完之后
访问 根目录没问题~ 看到首页妹子图片了
但是 访问域名/info
$app->route('GET /info',array( 'Lazyphp\Controller\LazyphpController','info'));
直接就404了

我在使用的过程中发现用你给的demo正则总是不匹配

这是我的Contorller

class TestController{

    /**
     * 文档分段信息
     * @ApiDescription(section="User", description="查看用户详细信息")
     * @ApiLazyRoute(uri="/user(/@id:[0-9]+",method="GET")
     * @ApiParams(name="id", type="int", nullable=false, description="Uid", check="i|check_not_empty", cnname="用户ID")
     * @ApiReturn(type="object", sample="{'id':123}")
     */
    function info($id){
        if( !$user = db()->getData( "SELECT * FROM `user` WHERE `id` =:id LIMIT 1" , $id )->toLine() )
            throw new \Lazyphp\core\DataException("UID 对应的用户数据不存在");
        return send_result( $user );
    }
}

但是在lib/functions.php

function parse_comment( $comment )
{
    print_r($comment);
    $ret = false;

    $reg = '/@Api(.+?)\((.+?)\)$/im';
    if( preg_match_all($reg,$comment,$out) )
    {
        print(in);
        $ret = array() ; $i = 0 ;

        while( isset( $out[1][$i] ) )
        {
            $ret[$out[1][$i]][] = str2value( $out[2][$i] );

            $i++;

        }
    }
    var_dump($ret);
    return $ret;
}

这里总是无法验证通过,总是返回false,由于我不是很懂正则表达式,不能找出问题所在

添加核心函数的单元测试

主要是_lp/lib/functions.php 中的函数。包括迅捷函数和数据库函数。数据库相关测试需要配合dbunit或者phinx来写。

1.0 文档的书写

包括以下内容:

  • 设计理念和特色介绍 ( 整理目前的ReadMe即可
  • 快速起步 ( 如何在各种环境上部署一个可用的LP4,包括 Windows、Linux、Mac以及SAE、BAE
  • 使用手册 ( 各部分的详细说明,以下是提纲
    • 路由指定 ( 参考flightphp的介绍 ,进行整合
    • 文档生成 ( 参考php-apidoc ,进行整合
    • 参数验证 ( 从ApiParams开始介绍,分析路由指定参数和方法绑定参数的不同和使用方法
    • 结果和错误输入 ( 如何通过send_result 和 send_error 输入结果,以及通过异常处理通用错误。还有通过send_json输出自定义格式结果
    • 数据库使用 ( 函数接口、对象接口。对象接口新增的结果处理方法,以及针对表的Ldo对象。
    • 配置的设置和读取 ( 这个和LP3一致
  • 高级使用教程
    • Composer的使用
    • PHPUnit的使用
    • Behat的使用
    • Phinx的使用

LazyRest4的规划说明

和目前版本的LazyRest比起来,LR4将有如下新特性:

  • 不再直接读取数据库,通过LP4目录下的meta文件获取数据表信息。
  • 不再动态生成代码,直接通过交互界面生成和修改LP的方法注释(需要提供备份和回滚方案。
  • 接口不再通过表生成,表信息作为接口生成的辅助数据。

界面部分参照设计原型。

新人安装后不知道怎么继续

新人安装后,访问首页看到的是
{"code":0,"message":"","data":{"top_title":"Version 4.5","title":"Version 4.5"},"created":"2016-05-15 15:49:39"}
这是哪里出了问题啊?

之前用了几年lazyPHP3,今天想升级一下,结果搞不定!55555

安装过程,就是先git clone,然后安装composer-setup.exe,然后
C:\kk**_test\LazyPHP4a>composer install
Your version of PHP, 5.4.17, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade.
Loading composer repositories with package information
Updating dependencies (including require-dev)

  • Installing symfony/finder (v2.3.41)
    Loading from cache
  • Installing behat/gherkin (v2.2.9)
    Loading from cache
  • Installing symfony/css-selector (v2.1.13)
    Loading from cache
  • Installing behat/mink (v1.4.0)
    Loading from cache
  • Installing symfony/yaml (v2.8.6)
    Loading from cache
  • Installing symfony/polyfill-mbstring (v1.1.1)
    Loading from cache
  • Installing symfony/translation (v2.8.6)
    Loading from cache
  • Installing symfony/event-dispatcher (v2.8.6)
    Loading from cache
  • Installing symfony/dependency-injection (v2.8.6)
    Loading from cache
  • Installing symfony/filesystem (v2.8.6)
    Loading from cache
  • Installing symfony/config (v2.8.6)
    Loading from cache
  • Installing symfony/console (v2.8.6)
    Loading from cache
  • Installing behat/behat (v2.4.6)
    Loading from cache
  • Installing behat/mink-extension (v1.0.1)
    Loading from cache
  • Installing symfony/process (v2.3.41)
    Loading from cache
  • Installing symfony/dom-crawler (v2.3.41)
    Loading from cache
  • Installing symfony/browser-kit (v2.3.41)
    Loading from cache
  • Installing guzzle/common (v3.9.2)
    Loading from cache
  • Installing guzzle/stream (v3.9.2)
    Loading from cache
  • Installing guzzle/parser (v3.9.2)
    Loading from cache
  • Installing guzzle/http (v3.9.2)
    Loading from cache
  • Installing fabpot/goutte (v1.0.7)
    Loading from cache
  • Installing behat/mink-browserkit-driver (v1.0.3)
    Loading from cache
  • Installing behat/mink-goutte-driver (v1.0.6)
    Loading from cache
  • Installing crada/php-apidoc (dev-master e655994)
    Cloning e655994d2f9f4efe2c451bb6956438bac5d8a1b8
    Failed to download crada/php-apidoc from source: Failed to clone https://github.com/calinrada/php-apidoc.git, git was not found, check that it is installed and in your PATH env.

'git' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

Now trying to download from dist
  • Installing crada/php-apidoc (dev-master e655994)
    Loading from cache
  • Installing robmorgan/phinx (v0.5.3)
    Loading from cache

behat/mink suggests installing behat/mink-sahi-driver (to enable Sahi.JS support)
behat/mink suggests installing behat/mink-selenium-driver (to enable Selenium1 support)
behat/mink suggests installing behat/mink-selenium2-driver (to enable Selenium2 (webdriver support))
behat/mink suggests installing behat/mink-zombie-driver (to enable Zombie.js support)
symfony/translation suggests installing psr/log (To use logging capability in translator)
symfony/event-dispatcher suggests installing symfony/http-kernel ()
symfony/dependency-injection suggests installing symfony/expression-language (For using expressions in service container configuration)
symfony/dependency-injection suggests installing symfony/proxy-manager-bridge (Generate service proxies to lazy load them)
symfony/console suggests installing psr/log (For using the console logger)
behat/behat suggests installing behat/symfony2-extension (for integration with Symfony2 web framework)
behat/behat suggests installing behat/yii-extension (for integration with Yii web framework)
Package guzzle/common is abandoned, you should avoid using it. Use guzzle/guzzle instead.
Package guzzle/stream is abandoned, you should avoid using it. Use guzzle/guzzle instead.
Package guzzle/parser is abandoned, you should avoid using it. Use guzzle/guzzle instead.
Package guzzle/http is abandoned, you should avoid using it. Use guzzle/guzzle instead.
Writing lock file
Generating autoload files

求各位大神指点 qq492607291

添加路由、输入验证和文档生成的单元测试和验收测试

测试在指定路由的情况下,Dispatcher是否运行正常。

重点包括 路由中带有参数,路由中带有可选参数,以及路由和参数绑定同时带有参数的情况。

可在PHPUnit中手动加载meta数组进行测试,或者通过behat 直接测试接口。

一直提示Warning: require(/home/LazyPHP4/vendor/autoload.php)

5个月前clone下来尝试了,是这个错误提示。
5个月后clone下来,还是这个错误提示。
我想一定是我的打开方式不对。
话说是一直提示:Warning: require((/home/LazyPHP4/vendor/autoload.php)
还使用Composer install和Composer update过了,都不行。
这程序太高端了~~~
有点搞不定~

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.