您的当前位置:首页利用composer搭建一个PHP微框架(API微项目)

利用composer搭建一个PHP微框架(API微项目)

2024-12-12 来源:哗拓教育

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

  • 通过搭建一个框架更好的学习PHP
  • 搭建一个专门用于构建API的微型框架。

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

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

概念了解

  • 框架,就是遵照一定的规范(),借助他人的轮子,实现快速业务,安全等附加价值。
  • MVC,一种分工协作的模式。还有依赖注入、单例等等很多设计模式。
  • 框架流程大体是:URI--》入口文件--》路由--》控制器--》服务层--》模型层--》返回结果(html、json、xml等)

准备工作

  • 了解composer,使用
  • 安装LAMP或者,,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自动加载问题,请补充相关知识。

第二步:路由

选择一个路由轮子

   "require": {
        "noahbuscher/macaw": "dev-master"
    }

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

用来转发HTTP的请求

touch index.php

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

<?php
require_once __DIR__ . '/vendor/autoload.php';
use \NoahBuscher\Macaw\Macaw;
Macaw::get('/', function() {
    echo 'Welcome to Bee!';
});
Macaw::dispatch();

第三步:控制器

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

<?php
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:

<?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;
    }
}
array(2) {
  ["start"]=>
  string(2) "10"
  ["len"]=>
  string(2) "20"
}


image.png

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

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

use \Bee\PDO\Model;
Model::config(require_once __DIR__ . '/config/db.php');

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

<?php
//单个数据库服务器
return [
    'host' => '127.0.0.1',
    'port' => 3306,
    'dbname' => 'mysql_test',
    'options' => null,
    'username' => 'root',
    'password' => '',
];

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

<?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:

<?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);
    }
}

待完善

  • Request(和Respone)的封装
  • Route的丰富,比如路由分组
  • 增加服务,比如Redis。服务一般用到的是依赖注入容器。这个设计模式足够喝一壶的。
    这里才发现Laravel的强大,定时任务、ORM、队列......

参考

显示全文