为什么搭建一个框架(搭建一个怎样的框架)

通过搭建一个框架更好的学习PHP

搭建一个专门用于构建API的微型框架。

微型框架基本上是一个封装的路由,用来转发HTTP请求至一个闭包,控制器,或方法等等,尽可能地加快开发的速度,有时还会使用一些类库来帮助开发,例如一个基本的数据库封装等等。

为了快速实现,我们尽可能的使用他人造好的轮子,然后进行组装。

概念了解

框架,就是遵照一定的规范(PHP-FIG),借助他人的轮子,实现快速业务,安全等附加价值。

MVC,一种分工协作的模式。还有依赖注入、单例等等很多设计模式。

框架流程大体是:URI--》入口文件--》路由--》控制器--》服务层--》模型层--》返回结果(html、json、xml等)

准备工作

了解composer,使用Packagist中国镜像

安装LAMP或者LNMP,,windows下可以安装集成环境,如wamp server等。

最好安装了git:1.可以在windows下使用Git Bash;2.方便代码同步到github等。

如果你对上述3个问题都不熟悉,可以点击这里

第一步:利用composer创建项目

选择一个目录,如/tmp或者C:\Users\Public\

mkdir bee //给一个项目命名往往很烧脑,我取名‘小蜜蜂’,。

cd bee

composer init

按照提示输入即可,如图。

composer init

bee目录下生成了composer.json,

然后执行composer install,

bee目录下生成了vendor目录,效果如图。

vendor

恭喜你完成了最艰难的第一步!

composer主要用到了spl_autoload_register等方法,关于PHP自动加载问题,请补充相关知识。

第二步:路由

选择一个路由轮子

github上路由轮子太多了,选择往往也很纠结。

目前star最多的FastRoute被用于Slim框架,它遵照最新的PSR7规范,有些复杂。

这里选择一个简单的Macaw

在命令行执行composer require noahbuscher/macaw:dev-master。

效果就是在composer.json中多出了

"require": {

"noahbuscher/macaw": "dev-master"

}

新建入口文件index.php(也可以叫前端控制器)

用来转发HTTP的请求

touch index.php

依照文档在index.php内容添加:

require_once __DIR__ . '/vendor/autoload.php';

use \NoahBuscher\Macaw\Macaw;

Macaw::get('/', function() {

echo 'Welcome to Bee!';

});

Macaw::dispatch();

执行命令php -S 127.0.0.1:8000,启动PHP自带的server。

在浏览器输入http://127.0.0.1:8000/,见证奇迹的时刻:浏览器输出了“Welcome to Bee!”;

恭喜您,一个框架即将诞生!

第三步:控制器

Macaw路由组件可以HTTP请求转发给控制器。

增加路由:

require __DIR__ . '/vendor/autoload.php';

use \NoahBuscher\Macaw\Macaw;

Macaw::get('/', function () {

echo 'Welcome to Bee!';

});

//用户的增删改查

Macaw::get('/users', 'Bee\Controllers\Users@index');

Macaw::post('/users', 'Bee\Controllers\Users@store');

Macaw::get('/users/(:num)', 'Bee\Controllers\Users@show');

Macaw::put('/users', 'Bee\Controllers\Users@update');

Macaw::delete('/users/(:num)', 'Bee\Controllers\Users@destroy');

Macaw::dispatch();

新建app目录,新建controllers目录,新建Users.php:

namespace Bee\Controllers;

class Users

{

public function index()

{

var_dump($_GET);

}

public function store()

{

var_dump($_POST);

}

public function show($id)

{

echo $id;

}

public function update()

{

$_PUT = array();

if ('put' == strtolower($_SERVER['REQUEST_METHOD'])) {

parse_str(file_get_contents('php://input'), $_PUT);

}

var_dump($_PUT);

}

public function destroy($id)

{

echo $id;

}

}

且修改vendor\noahbuscher,acaw\Macaw.php的29行代码:

$uri = dirname($_SERVER['PHP_SELF']).'/'.$params[0];

$uri = strpos($params[0], '/') === 0 ? $params[0] : dirname($_SERVER['PHP_SELF']) . '/' . $params[0];

利用chrome的Postman工具查看用户的5个请求。

比如:

GET http://127.0.0.1:8000/users?start=10&len=20

得到

array(2) {

["start"]=>

string(2) "10"

["len"]=>

string(2) "20"

}

注意:当请求是PUT时,postman中的请求方式选择‘x-www-form-urlencoded’

image.png

这种content-type问题,也是Slim,Symfony框架的价值所在,他们封装了HTTP的请求Request和相应Respone为对象,有很多方法可用。

可以通过查看Symfony的http-foundation\Request的源码的createFromGlobals()的函数看到这是一个

Creates a new request with values from PHP's super globals.是输入php的超全局变量,输出一个request对象。Laravel的request也是在此基础上增加一些接口,继续封装一层而已。

后续会补充相关的轮子,优化框架。而简单起见,这样做也可以了。

至此,一个完整的RESTful的增删改查已经完成。

第四步:模型层(数据层)

Laravel的ORM很优雅,但是太重,还消耗内存等资源,不建议用于一个微型框架。

而且为了sql的优化和学习,这里采用PDO方式连接数据库。我将此类库独立出组件放到了packagist上。

composer require biaoqianwo/simple-pdo加载改组件。

然后,入口文件新增:

use \Bee\PDO\Model;

Model::config(require_once __DIR__ . '/config/db.php');

新建config目录,新建db.php:

//单个数据库服务器

return [

'host' => '127.0.0.1',

'port' => 3306,

'dbname' => 'mysql_test',

'options' => null,

'username' => 'root',

'password' => '',

];

然后在app目录下新建models目录,再新建Users.php:

namespace Bee\Models;

use Bee\PDO\Model;

class User extends Model

{

}

修改composer.json,增加:

"classmap": [

"app/controllers",

"app/models"

]

然后执行一次composer dump-autoload

修改controller\Users.php:

namespace Bee\Controllers;

use Bee\Models\User;

class Users

{

public function index()

{

$offset = !empty($_GET['start']) ? (int)$_GET['start'] : 0;

$rows = !empty($_GET['len']) ? (int)$_GET['len'] : 10;

$created_at = time() - 86400;//前24小时

//测试发现:limit后面的数字不能使用预处理的'?'

$sql = 'select * from users where created_at > ? order by id desc limit ' . $offset . ',' . $rows;

$conditions = [$created_at];

$result = User::get($sql, $conditions);

var_dump($result);

}

public function store()

{

$name = !empty($_POST['name']) ? $_POST['name'] : 0;

$pwd = !empty($_POST['pwd']) ? $_POST['pwd'] : '123456';

$pwd = password_hash($pwd, PASSWORD_DEFAULT);

$sql = "insert users(`name`,`pwd`) values(?,?)";

$conditions = [$name, $pwd];

$result = User::insert($sql, $conditions);

var_dump($result);

}

public function show($id)

{

$sql = "select * from users where id = ?";

$conditions = [$id];

$result = User::first($sql, $conditions);

var_dump($result);

}

public function update()

{

$_PUT = array();

if ('put' == strtolower($_SERVER['REQUEST_METHOD'])) {

parse_str(file_get_contents('php://input'), $_PUT);

}

$id = !empty($_PUT['id']) ? $_PUT['id'] : 0;

$pwd = !empty($_PUT['pwd']) ? $_PUT['pwd'] : '123456';

$pwd = password_hash($pwd, PASSWORD_DEFAULT);

$sql = "update users set `pwd` = ? where id = ?";

$conditions = [$pwd, $id];

$result = User::update($sql, $conditions);

var_dump($result);

}

public function destroy($id)

{

$sql = "delete from users where id = ?";

$conditions = [$id];

$result = User::delete($sql, $conditions);

var_dump($result);

}

}

一个完整的CRUD的框架就完成了。完整代码地址

其实这不能算是一个框架,这只是一个利用了一个路由组件和一个数据库组件的RESTful小项目。

框架是利用依赖注入等将这2个组件(或者其他组件),外加一些服务封装到一个App类,然后打包到一起。

项目就是利用这个打包,再加上一些目录规范,不断的重复性的CRUD等等。

待完善

Request(和Respone)的封装

Route的丰富,比如路由分组

增加服务,比如Redis。服务一般用到的是依赖注入容器。这个设计模式足够喝一壶的。

这里才发现Laravel的强大,定时任务、ORM、队列......

参考

php 框架搭建,利用composer搭建一个PHP微框架(API微项目)相关推荐

  1. php 利用个人邮箱,利用 Composer 完善自己的 PHP 框架(二)——发送邮件

    利用 Composer 完善自己的 PHP 框架(二)--发送邮件 2014-10-18 / 阅读数:23506 / 分类: PHP 回顾 上一篇文章中,我们手工建造了一个简易的视图加载器,顺便引入了 ...

  2. 设计php框架_利用 Composer 一步一步构建自己的 PHP 框架(三)——设计 MVC

    利用 Composer 一步一步构建自己的 PHP 框架(三)--设计 MVC 2014-10-14 / 阅读数:50438 / 分类: PHP 终于可以 "一次编写,到处发布" ...

  3. 利用EasyDL制作一个简单的图片识别小项目

    主要是利用EasyDL制作一个简单的傻瓜式猫狗图片识别,利用EasyDL,只需要几步简单的点击即可 *主要的步骤: 1.准备数据 2.训练模型 3.部署 4.H5 * 1.首先创建两个文件夹cat和d ...

  4. 利用Composer搭建企业内部仓库

    1. 在github上创建项目 2. 在服务器上创建composer包 composer init 根据创建命令步骤提示,填写相应信息,最终生成如下所示 composer.json {"na ...

  5. 【完结】利用 Composer 完善自己的 PHP 框架(三)——Redis 缓存

    本教程示例代码见 https://github.com/johnlui/My-First-Framework-based-on-Composer 回顾 上两篇文章中我们完成了 View 视图加载类和 ...

  6. 从零开始写javaweb框架 pdf_大学写的一个 Java Web 框架

    简介 today-web是一个基于Servlet的高性能轻量级Web框架. 安装 <dependency><groupId>cn.taketoday</groupId&g ...

  7. go语言mysql框架_超级详细:Go语言框架Gin和Gorm实现一个完整的待办事项微服务...

    前言 本文通过一步一步的设计,最终实现一个完善的todo应用. 我们使用GO框架Gin用户路由控制和返回数据.使用Gorm用于操作数据库. 读者可根据本教程操作,最终实现列出的各项功能. 技术清单 本 ...

  8. 利用TICK搭建Docker容器可视化监控中心

    概述 性能监控是容器服务必不可少的基础设施,容器化应用运行于宿主机上,我们需要知道该容器的运行情况,包括 CPU使用率.内存占用.网络状况以及磁盘空间等等一系列信息.在我的前文<Docker容器 ...

  9. 利用Flutter写一个跨平台的果核APP(0)——介绍

    前言 今年2月的时候,Google在开发者大会上推出了flutter的第一个预览版,我是在3月左右的时候才了解到这个全新的跨平台框架,并在阅读了相关文档之后写了一篇<你好,Flutter> ...

最新文章

  1. 『TensorFlow』卷积层、池化层详解
  2. vfp语言第 代计算机语言,VFP语言属于第()代计算机语言。A、一B、二C、三D、四...
  3. python科学计算基础教程pdf下载-Python科学计算基础教程_PDF电子书
  4. 基于数据中心废热利用的供冷、供热系统
  5. 关于一个枚举IE表单的DLL,编译无错,但是得不到想到的结果。
  6. Scala @BeanProperty注解生成getter/setter
  7. pandas seaborn绘制箱型图,探索时间序列数据季节性
  8. windows2008 服务器时间格式改不过来_我用VNPY 1天时间搭建自主量化交易(程序化交易)平台...
  9. js高级学习笔记(b站尚硅谷)-12-执行上下文
  10. 安防经济逐渐景气下行 安企是否能排除万难冲出阴霾?
  11. 数学文化赏析期末笔记
  12. 联想 计算机无线网络设置方法,联想g400如何打开无线_联想G400s笔记本电脑无线开关在哪-win7之家...
  13. plc串口通讯 qt_QT与PLC通信
  14. 贫富差距,不是收入分化,而是资产分化
  15. uni-app上传图片base64
  16. 倒数闩锁CountDownLatch源码浅析
  17. 谷歌浏览器与IE浏览器不兼容问题
  18. 解决键盘模式(布局)的错误导致的部分键位失灵或异常(姑且这样描述问题吧)
  19. 西门子博图指令(计数器操作)
  20. 加密流量也能识别与管控,绿网借至强AI加速能力打造高效智能DPI方案

热门文章

  1. 深度学习中如何实现数据增强,扩大数据集
  2. 用andengine做一款俄罗斯方块游戏
  3. python制作查询网页_django+mysql实现网页查询
  4. 重启 mysql_重启MySQL的正确方法
  5. Uber 分布式追踪系统 Jaeger 使用介绍和案例【PHP Hprose Go】
  6. H3C云实验室模拟器
  7. Houdini-学习之路(一)
  8. 零基础做知识变现,可以试试这几种方式
  9. 安全有保障,效率大提升 | 超千点麒麟信安云在长沙某银行稳定运行!
  10. windows电脑快捷键操作总结