[PhalApi]轻量级PHP后台接口开发框架 - 让接口开发更简单
[PhalApi]轻量级PHP后台接口开发框架 - 让接口开发更简单
暗夜在火星 发表于3年前
[PhalApi]轻量级PHP后台接口开发框架 - 让接口开发更简单
  • 发表于 3年前
  • 阅读 2694
  • 收藏 39
  • 点赞 17
  • 评论 36

华为云·免费上云实践>>>   

摘要: PhalApi 开放式轻量级后台系统框架,主要是为开发应用开发框架提供底层基友,以应对海量数据、高并发下各种开发需求。即您可以在核心类库的基础上,进行扩展实现应用开发框架,从而为应用开发提供框架支持。此系列开发框架,不仅仅是为了提供技术上的方便,我们更致力于分享软件工程和开源社区中优秀的思想、原则、模式和最佳实践,从而帮助更多的PHP开发人员。谢谢!

一句话描述

PhalApi是一个轻量级PHP后台接口开发框架,目的是让接口开发更简单。

在这个框架中,我们不只是提供一个可以快速进行后台接口开发的框架,更多是分享那些有趣和值得学习、实践的内容,一如:领域驱动设计、设计模式、原则和最佳实践、敏捷开发、单元测试, 以及如何在此开发框架的基础上扩展衍生自定义的应用框架。


代码下载:http://git.oschina.net/dogstar/PhalApi

WIKI文档:http://www.phalapi.net/wikis/

(全部设置了隐私的文档都可以在此WIKI找到,以便统一维护)


温馨提示:最近发现网络爬虫盛行,请从上面的链接获取最新的内容,谢谢。特别对于框架文档,请移步到WIKI。如有问题,可以通过QQ(376741929)与我联系,或进入QQ群:421032344。


官网

目前官网还在努力开发中,感兴趣的同学可以访问:www.phalapi.net

安装

将代码下载解压到服务器后即可,然后把根目录设置为./Public。如nginx下:

root   /.../PhalApi/Public;

为验证是否安装成功,可以访问默认接口服务,如:http://localhost/PhalApi/demo/,正常时会返回类如:

{
    "ret": 200,
    "data": {
        "title": "Default Api",
        "content": "PHPer您好,欢迎使用PhalApi!",
        "version": "1.1.0",
        "time": 1422779027
    },
    "msg": ""
}

后台接口开发就是如此简单,Write the code, enjoy yourself !


接口示例开发

最终接口调用的效果

接口的请求统一以service传递服务名称,格式为:?service=XXX.XXX,并以JSON格式返回

打开浏览器后,访问已经配置好的域名,假设为:http://localhost/PhalApi/,则当请求示例接口:

http://localhost/PhalApi/demo/?service=Default.Index&username=dogstar

可以看到以下的输出:

{"ret":200,"data":{"title":"Default Api","content":"dogstar\u60a8\u597d\uff0c\u6b22\u8fce\u4f7f\u7528PhalApi\uff01","version":"1.1.0","time":1422783895},"msg":""}


简单的统一入口文件

//$ vim ./Public/demo/index.php
<?php
/**
 * Demo 统一入口
 */

require_once dirname(__FILE__) . '/../init.php';

//装载你的接口
DI()->loader->addDirs('Demo');

/** ---------------- 响应接口请求 ---------------- **/

$server = new PhalApi();
$rs = $server->response();
$rs->output();

上面的入口文件,简单明了。先创建一个接口实例,然后响应,最后返回输出结果。

但是我们在这之前需要自定义初始化文件 init.php,以设置一些基础的环境以及注册需要使用到的服务

初始化文件,有很大的定制化过程。各应用可以根据需要自定义注册各种需要使用到的服务。我们不强加开发者使用框架中的功能,而是提供足够的空间由开发者自行决策,并且也鼓励开发人员扩展开发

示例接口的实现

接口的编写,相当于我们在网站开发中的controller,但这里我们更倾向于称之为:接口服务

如下,当我们需要提供一个接口服务时,我们只需要继承Core_Api父类,并且配置 一下参数规则,最后实现接口就可以访问了。

//$ vim ./Demo/Api/Default.php 
<?php
/**
 * 默认接口服务类
 *
 * @author: dogstar 2014-10-04
 */

class Api_Default extends PhalApi_Api
{
    public function getRules()
    {
        return array(
            'index' => array(
                'username'  => array('name' => 'username', 'default' => 'PHPer', ),
            ),
        );
    }
    
    public function index()
    {
        return array(
            'title' => 'Default Api',
            'content' => T('Hello {name}, Welcome to use PhalApi!', array('name' => $this->username)),
            'version' => PHALAPI_VERSION,
            'time' => $_SERVER['REQUEST_TIME'],
        );
    }
}

更多入门的开发,请查看:[PhalApi]快速入门 - 接口开发示例 - 源码&图文


勿忘初心,方得始终

虽然现在这个社会的节奏很快,但如果有时间时,我们不妨静下来,稍微思考一下,然后你会发现:慢慢来,比较快。

PhalApi 的初衷

有句话说:勿忘初心,方得始终

而我们之所以开源这个框架,是因为我们想致力于提供可以快速进行开发后台接口的框架,并且通过这个框架分享更多开发的最佳实践、原则和模式!这就是我们的初心,也希望我们能一直坚持下去。

同 时也因为在最近这几年,发现后台接口开发的需求量越来越多,但很多PHP开源框架更多是关注于网站方面的开发,并且发现很多现有的后台接口开发都显然很凌 乱,不够成熟和规划。甚至有些好友还问我,接口到底为何物?要怎么开发?

特此在这里,根据这些年来对PHP后台接口开发工作中的收获,经验和自身的需求,研发开源这套后台接口框架。希望能给更多的人带来帮助,谢谢!

PhalApi命名的来源

得益于开源社区,现在有很多优秀的开源框架。确实有很多框架值得我们去学习和使用,其中高性能的Phalcon框架和可视化代码评审工具 Phabricator都是相当令人敬佩和认可的。前者在思想、模式和原则上有很好的文档说明;后者在包管理、命名写法等都非常好地体现了代码重用。受此 两个框架的影响,故取名为:PhalApi。

PhalApi 简介

PhalApi 是一个微架构,为开发框架提供底层系统级的公共技术支持。此开发框架,更多地专注于后台系统框架,即无过多页面输出和展示的系统(也就是我们通常所说的网站、Web-based App),而更多是后台接口。

开放式:作 为微架构的PhalApi,是为了提供底层的技术支持,从而开发人员可以在这基础上做出更多丰富的框架研发。开放式,意味着是富于变化的,也就是充满活力 和生气。因为我们在进行新项目开发选取开源框架时总会选择第三方开源框架和自主研发之间纠结。而PhalApi 则更愿意为您提供可以进行自主定制开发框架的底层支持。

轻量级:包括很多框架在内,都会有一个很好的定位,在关于”做什么“和”不做什么“都会有一些决策性的权衡。遵循敏捷开发实践,我们这里也不过度地提供不必要的底层支持,而是追求短而美。

后台系统框架:限定于后台系统框架,也是突出了这个微框架的关注点。而这个关注点是基于当前海量数量和智能手机兴起大背景下带来的终端App的快速发展而引起对后台接口的需要。而这之前,很多框架都是为了网站或者Web-based App开发的。

更为重要的

除 了上面说的富于变化的开放式、短而美的轻量级和为更多App提供后台系统框架外,更为重要的是,很多框架都是注重于对框架性能的关注,即归根到底是对计算 机成本的关注。而没有关注软件开发中最最为重要的资源--开发者,开发团队,即我们所说的:人。因此也没有更多地关注软件开发中的思想、原则、模式和最佳 实践。

所以,PhalApi 要做的是,通过自身的不断完善和支持,逐渐把更多的PHP开发人员往更好的代码编写、最佳实践靠拢,消除很多人对PHP的误解和误用。确实,PHP作为一 门脚本语言,有其简单性,也正是它的简单性,导致了PHP的泛滥,导致了现在很多项目充斥难以维护和BUG缠身的项目。

PHP只是一门语言,其本身没有所谓的错与对,好与坏,而在于我们如何使用它,而如何使用它又源于我们的思想。人之所以不同,正是因为思想不同。

总而言之,PhalApi 提供的不仅仅是一个微框架,更多是分享如何进行高效的软件开发。


框架快照

下面是本框架中一些重要的思想和特点,这里简单介绍,后面会有专题对各部分进行详细说明。

主要目录结构

主 要目录有核心类库Core、第三方类库ThirdParty和单元测试Test。作为公共底层,Core更多是提供稳定的抽象类,或者提供规约层的接 口;ThirdParty目前包含有专门针对DB操作的NotORM,一个优秀的开源框架;一些工具Tool目录,暂时有SQL生成器;Test则用于放 置单元测试,其中默认就包括了对核心类库包的单元测试。

.
│
├── PhalApi         //PhalApi框架,后期可以整包升级
│
│
├── Public          //对外访问目录,建议隐藏PHP实现
│   └── demo        //Demo服务访问入口
│
│
├── Config          //项目接口公共配置,主要有:app.php, sys.php, dbs.php
├── Data            //项目接口公共数据
├── Language        //项目接口公共翻译
├── Runtime         //项目接口运行文件目录,用于存放日记,可软链到别的区
│
│
└── Demo            //应用接口服务,名称自取,可多组
    ├── Api             //接口响应层
    ├── Domain          //接口领域层
    ├── Model           //接口持久层
    └── Tests           //接口单元测试


核心思想:DI依赖注入

关 于DI,Phalcon有非常优秀的文档说明(请查看:http://docs.phalconphp.com/en/latest/reference /di.html),这里不再赘述。而我们在Phal+ 微驾构中之所以使用DI,并把DI作为不可或缺的一部分,是因为我们希望提供接口规约,而把具体实现留给开发框架自主实现,乃至应用项目定制化。同时,我 们也提供了一些基础的、默认的子类实现,以便满足一般性的需要。

重要原则:针对接口编程,而不是针对实现编程

正 如您所见的,我们在Phal+ 微驾构中,更多的是提供接口,提供标准,提供稳定的抽象类。并且结合依赖注入进行服务组件的注册。这样的好处在于,我们有了统一的标准,也符合软件工程开 发的原则,也为日后的框架升级、调整作好了铺垫。因为我们把分离了创建和使用,然后通过简单的服务注册便可以引进使用。我们称之为”开发-注册-使用“模 式:定制化开发、一处注册、重复使用。

最佳实践:测试驱动开发

关于单元测试,这里也不作过多说明。既然我们遵循敏捷开发,所以我们也坚持其中的最佳实践:单元测试和测试驱动开发。并且提供了生成测试代码骨架的脚本,具体使用说明请查看:http://my.oschina.net/u/256338/blog/285579

生成测试代码骨架的脚本的Usage如下:

$ ./PhalApi/build_phpunit_test_tpl.php
Usage: php $ ./PhalApi/build_phpunit_test_tpl.php <file_path> <class_name> [bootstrap] [author = dogstar]

以下是目前核心框架单元测试的覆盖率(高达90%以上!!!此处应该有掌声,^_^):

海量数据:可配置的分库分表

为了避免重复开发,我们使用了NotORM来进行DB操作,同时为了更友好地支持海量数据的存储,我们在NotORM的基础上实现了数据库可配置的分库分表存储。主要的思想有:可配置的分库分表存储、SQL语句自动生成、统一的路由规则等。

$  php ./PhalApi/build_sqls.php 

Usage: ./PhalApi/build_sqls.php <dbs.php> <table> [engine=InnoDB]


扩展自己的应用框架

此开发框架虽然专注于后台接口开发,但却富有变化。其他的后台领域的开发,都可以在此基础上进行扩展。一如:


PhalWechat - 插件式的微信开发框架

开源中国代码托管传送门:http://git.oschina.net/dogstar/PhalWechat

或直接:https://git.oschina.net/dogstar/PhalWechat.git


参考框架

Phalcon:http://www.phalconphp.com/

Yii:http://www.yiichina.com/

Phabricator:http://phabricator.org/


学习网站

PHP编码规范:PHPhttp://www.php-fig.org/


欢迎使用

如果您正需要进行一个新项目的后台接口开发,如果您还没找到合适的PHP开发框架,欢迎尝试此框架!

此框架已历经两年的设计、初步实现、试用、重构、优化,再实战,已基本可以为海量访问、大数据、轻应用提供接口开发的基础。但出于对已知应用项目的保密,这里不罗列应用案例。

如有问题,欢迎随时交流,谢谢!2015年,我们一起开源,一起进步!


2015年01月,写于广州,一个下雨的夜晚。


共有 人打赏支持
暗夜在火星
粉丝 141
博文 139
码字总数 299730
作品 1
评论 (36)
相信你自己
niu
高翔303
( ! ) Warning: require_once(E:\git\PhalApi\Public/..\E:\git\PhalApi\Core/functions.php): failed to open stream: Invalid argument in E:\git\PhalApi\Core\Loader.php on line 50
Call Stack
#  Time  Memory  Function  Location
1  0.0010  142320  {main}( )  ..\index.php:0
2  0.0020  152792  require_once( 'E:\git\PhalApi\Public\init.php' )  ..\index.php:6
3  0.0030  163352  Core_Loader->__construct( )  ..\init.php:13
4  0.0030  163672  Core_Loader->loadFile( )  ..\Loader.php:28

( ! ) Fatal error: require_once(): Failed opening required 'E:\git\PhalApi\Public/..\E:\git\PhalApi\Core/functions.php' (include_path='.;C:\php\pear') in E:\git\PhalApi\Core\Loader.php on line 50
Call Stack
#  Time  Memory  Function  Location
1  0.0010  142320  {main}( )  ..\index.php:0
2  0.0020  152792  require_once( 'E:\git\PhalApi\Public\init.php' )  ..\index.php:6
3  0.0030  163352  Core_Loader->__construct( )  ..\init.php:13
4  0.0030  163672  Core_Loader->loadFile( )
penngo
api开发项目,也有cli后台运行job,貌似没看到有支持。
JayKong
Phalcon确实不错。。目测已经码Phalcon一年多了
高翔303
我把Loader.php文件中的loadFile($filePath)修改为 require_once $filePath; 就不会出错了,php新手,不大懂。
纯24K爷们儿
思维构架是好的,但没考虑到最基本的安全性,服务接口必要的安全验证都没有(比如说签名验证、有效时间验证等),后面的扩展神马的再NB不安全也是不行的
lanybass

引用来自“高翔303”的评论

( ! ) Warning: require_once(E:\git\PhalApi\Public/..\E:\git\PhalApi\Core/functions.php): failed to open stream: Invalid argument in E:\git\PhalApi\Core\Loader.php on line 50
Call Stack
#  Time  Memory  Function  Location
1  0.0010  142320  {main}( )  ..\index.php:0
2  0.0020  152792  require_once( 'E:\git\PhalApi\Public\init.php' )  ..\index.php:6
3  0.0030  163352  Core_Loader->__construct( )  ..\init.php:13
4  0.0030  163672  Core_Loader->loadFile( )  ..\Loader.php:28

( ! ) Fatal error: require_once(): Failed opening required 'E:\git\PhalApi\Public/..\E:\git\PhalApi\Core/functions.php' (include_path='.;C:\php\pear') in E:\git\PhalApi\Core\Loader.php on line 50
Call Stack
#  Time  Memory  Function  Location
1  0.0010  142320  {main}( )  ..\index.php:0
2  0.0020  152792  require_once( 'E:\git\PhalApi\Public\init.php' )  ..\index.php:6
3  0.0030  163352  Core_Loader->__construct( )  ..\init.php:13
4  0.0030  163672  Core_Loader->loadFile( )
php.ini里的include_path
Adam_OuYang
C:\xampp\htdocs\demo\PhalApi\Core\Loader.php on line 50
Adam_OuYang
Warning: require_once(C:\xampp\htdocs\demo\PhalApi\Public/..\C:\xampp\htdocs\demo\PhalApi\Core/functions.php): failed to open stream: Invalid argument in C:\xampp\htdocs\demo\PhalApi\Core\Loader.php on line 50

Fatal error: require_once(): Failed opening required 'C:\xampp\htdocs\demo\PhalApi\Public/..\C:\xampp\htdocs\demo\PhalApi\Core/functions.php' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\demo\PhalApi\Core\Loader.php on line 50
Adam_OuYang

引用来自“高翔303”的评论

我把Loader.php文件中的loadFile($filePath)修改为 require_once $filePath; 就不会出错了,php新手,不大懂。
謝謝。 // $this->loadFile(dirname(__FILE__) . '/functions.php'); include(dirname(__FILE__) . '/functions.php');
Adam_OuYang

引用来自“高翔303”的评论

我把Loader.php文件中的loadFile($filePath)修改为 require_once $filePath; 就不会出错了,php新手,不大懂。
謝謝
Adam_OuYang
我想 應該是widnows跟linux環境路徑的 / 跟 \ 的問題。
暗夜在火星

引用来自“Adam_OuYang”的评论

Warning: require_once(C:\xampp\htdocs\demo\PhalApi\Public/..\C:\xampp\htdocs\demo\PhalApi\Core/functions.php): failed to open stream: Invalid argument in C:\xampp\htdocs\demo\PhalApi\Core\Loader.php on line 50

Fatal error: require_once(): Failed opening required 'C:\xampp\htdocs\demo\PhalApi\Public/..\C:\xampp\htdocs\demo\PhalApi\Core/functions.php' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\demo\PhalApi\Core\Loader.php on line 50
感谢您的提醒,已修正。这是因为在windows/linux环境下的路径差异造成的,后期我们会注意这些细节问题。
暗夜在火星

引用来自“HFLdragon”的评论

思维构架是好的,但没考虑到最基本的安全性,服务接口必要的安全验证都没有(比如说签名验证、有效时间验证等),后面的扩展神马的再NB不安全也是不行的

签名是有的,后面会有讲到。但因为是开源框架,所以出于安全考虑,签名方案由各自项目定义。
暗夜在火星

引用来自“penngo”的评论

api开发项目,也有cli后台运行job,貌似没看到有支持。
关于后台计划任务crontab这块,已经有的了,后面也会补上,谢谢。
暗夜在火星

引用来自“高翔303”的评论

我把Loader.php文件中的loadFile($filePath)修改为 require_once $filePath; 就不会出错了,php新手,不大懂。
是的,这是linux、windowns路径的分割符问题,可以用:DIRECTORY_SEPARATOR
Jason_hu
很赞,早点看到就好了。现在新的项目选定了java,有类似的框架不?
暗夜在火星

引用来自“Jason_hu”的评论

很赞,早点看到就好了。现在新的项目选定了java,有类似的框架不?
谢谢,JAVA这块暂时还没接触,或者您可以考虑一下等我把这个框架用JAVA来实现
terrancy
学习了,之前在这方面遇到很多问题积累了一些经验,我最近也正想写个类似的框架
暗夜在火星

引用来自“terrancy”的评论

学习了,之前在这方面遇到很多问题积累了一些经验,我最近也正想写个类似的框架

欢迎分享
×
暗夜在火星
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: