dingqing / e-php
一个更快的轻量级全栈PHP框架
1.0.0
2019-01-09 17:18 UTC
Requires
- catfan/medoo: ^1.6
Requires (Dev)
- phpunit/phpunit: ^7.5
- squizlabs/php_codesniffer: ^3.4
This package is auto-updated.
Last update: 2024-09-29 04:43:32 UTC
README
手动实现web框架(PHP)
理解
框架的工作原理
完成“基础设施”建设:方便的路由定义、错误处理、配置管理、服务管理、ORM等等,使得业务开发更加简洁、方便。
实现
文件目录
框架入口
public/index.php -> framework/start.php
自动加载
错误与异常处理
framework/handles/ErrorHandle.php
配置加载
framework/handles/ConfigHandle.php
服务容器
初级版买菜:直接去农户家购买,可能遇到农户没法提供想要的菜,总之出现各种问题,
改进版:去菜市场,比如想要买土豆,市场里面有很多农户提供服务。
即,增加中间层,将服务方与调用方解耦,农户专注为提供服务,买方去集市获取服务、不用关心服务的实现。
路由
framework/handles/RouterHandle.php
├─ router
├─ RouterInterface.php
├─ General.php [普通路由]
├─ Pathinfo.php [pathinfo路由]
├─ Userdefined.php [自定义路由]
├─ Job.php [脚本任务路由]
└─ RouterStart.php [路由策略入口类]
对象关系映射
把对象的链式操作解析成具体的sql语句。
├─ orm
├─ Interpreter.php [sql解析器]
├─ DB.php [数据库操作类]
├─ Model.php [数据模型基类]
└─ db [数据库类目录]
└─ Mysql.php [mysql实体类]
DB类使用示例
/**
* DB操作示例
*
* findAll
*
* @return void
*/
public function dbFindAllDemo()
{
$where = [
'id' => ['>=', 2],
];
$instance = DB::table('user');
$res = $instance->where($where)
->orderBy('id asc')
->limit(5)
->findAll(['id','create_at']);
$sql = $instance->sql;
return $res;
}
Model类使用示例
// controller 代码
/**
* model example
*
* @return mixed
*/
public function modelExample()
{
try {
DB::beginTransaction();
$testTableModel = new TestTable();
// find one data
$testTableModel->modelFindOneDemo();
// find all data
$testTableModel->modelFindAllDemo();
// save data
$testTableModel->modelSaveDemo();
// delete data
$testTableModel->modelDeleteDemo();
// update data
$testTableModel->modelUpdateDemo([
'nickname' => 'web-frame'
]);
// count data
$testTableModel->modelCountDemo();
DB::commit();
return 'success';
} catch (Exception $e) {
DB::rollBack();
return 'fail';
}
}
//TestTable model
/**
* Model操作示例
*
* findAll
*
* @return void
*/
public function modelFindAllDemo()
{
$where = [
'id' => ['>=', 2],
];
$res = $this->where($where)
->orderBy('id asc')
->limit(5)
->findAll(['id','create_at']);
$sql = $this->sql;
return $res;
}
单元测试
基于phpunit的单元测试。
如何使用?
在tests目录下编写测试文件,具体参考tests/demo目录下的DemoTest文件,然后运行:
vendor/bin/phpunit
测试断言示例:
/**
* 演示测试
*/
public function testDemo()
{
$this->assertEquals(
'Hello web-frame',
// 执行demo模块index控制器hello操作,断言结果是不是等于'Hello web-frame'
App::$app->get('demo/index/hello')
);
}
钩子
目的:规范化项目代码和commit记录。
- 代码规范:配合使用php_codesniffer,在代码提交前对代码的编码格式进行强制验证。
- commit-msg规范:采用ruanyifeng的commit msg规范,对commit msg进行格式验证,增强git log可读性和便于后期查错和统计log等,这里使用了Treri的commit-msg脚本。
使用
nginx配置虚拟主机根目录设置为项目中的public,然后访问虚拟主机地址。