vgalvoso/phpeasy

PHPEasy是一个以API为中心的PHP框架

v1.3 2024-04-08 06:03 UTC

This package is auto-updated.

Last update: 2024-09-08 06:49:13 UTC


README

PHPEasy是一个以API为中心的PHP框架。代码尽可能接近PHP语言本身,而不是框架。

特性

  1. REST API开发
  2. 全栈Web应用开发
  3. 基于文件的路由
  4. 轻量级,没有太多的依赖和配置
  5. 简单的数据库抽象层
  6. 辅助函数,如输入验证器、代码生成器、上传文件等。
  7. 促进使用ubt而不局限于过程式编程
  8. 支持PHP 8及以上,MySQL、MSSQL和SQLite
  9. 包括基本的css(mystyle.css)和js(vanscript.js)工具库。

主要特点

  1. 促进掌握PHP语言本身而不是框架。
  2. 直接明了的编码,没有太多的抽象。
  3. 使用数据抽象层而不是ORM,专注于最大性能,不使用ORM的大数据库调用。

目录

I. 简介

II. 先决条件

III. 安装

  1. 视图
  2. APIs
  3. API函数
  4. 与数据库一起工作
  5. 渐进式
  6. 额外

简介

这是为喜欢纯PHP及其简单性的人准备的。如今,你必须遵循编码标准(OOP、SOLID、DRY等)和MVC框架,才能使用PHP进行Web开发。现有的PHP框架包含太多的文件、配置、类和依赖关系。我制作了这个小型框架,这样PHP开发者可以更快地进行Web开发,同时掌握并享受PHP语言本身(是的!不需要学习那么多库)。

先决条件

  1. PHP 8^.
  2. Composer.

安装

Composer - 在根目录或htdocs文件夹内打开终端并执行以下命令。

composer create-project vgalvoso/phpeasy my_phpeasy

您可以将[my_phpeasy]更改为您想要的任何项目名称。

现在打开您的浏览器并转到 https:///my_phpeasy

1. 视图

在视图文件夹内创建视图。

视图路由将根据视图文件夹结构自动创建。

请看下面的示例。

  1. 视图文件路径:[View/admin/dashboard.php],路由:["admin/dashboard"]。
  2. 视图文件路径:[View/login.php],路由:["login"]。

如果视图文件名为[index.php],则可以省略文件名。

  1. 视图文件路径:[View/index.php],路由:[""]。
  2. 视图文件路径:[VIew/admin/index.php],路由:["admin"]。

1.1 视图组件

(SPA)单页应用程序由视图组件组成。

视图组件只能通过Ajax请求访问。

只需在视图文件顶部调用Core/Helper/component()即可将其指定为视图组件。

示例:View/admin/users_table.php

<?= Core/Helper/component(); ?>
<table>
    <thead>
        <tr>
            <th>Username</th>
            <th>First Name</th>
            <th>Last Name</th>
        </tr>
    </thead>
    <tbody id="users_tbl">
        <tr><td>No Contents</td></tr>
    </tbody>
</table>

2. APIs

PHPEasy支持REST API。

所有API都放置在api文件夹中。

API路由将根据api文件夹的文件结构和php文件中实现的以http动词命名的函数(例如get()、post()、patch())自动创建。

例如,如果您省略了delete()函数,则无法调用DELETE api/users/{id}。

以下是一个用户REST API的示例。

API文件路径:[api/users.php]

路由

  1. GET api/users - 获取所有用户
  2. GET api/users/{id} - 根据id获取用户
  3. POST api/users - 创建新用户
  4. DELETE api/users/{id} - 删除一个用户
  5. PUT api/users/{id} - 替换用户
  6. PATCH api/users/{id} - 更新一个用户
<?php

use Core\DAL;

use function Core\Helper\error;
use function Core\Helper\getRequestBody;
use function Core\Helper\response;
use function Core\Helper\startAPI;

startAPI();

function get(){
    $db = new DAL();
    //GET user by id
    if(defined('URI_PARAM')){
        $query = "SELECT * FROM users WHERE id = :id";
        $param = ["id" => URI_PARAM];
        if(!$user = $db->getItem($query,$param))
            response([]);
        response([$user]);
    }
    //GET All users
    $query = "SELECT * FROM users";
    $users = $db->getItems($query);
    response($users);
}

function post(){
    $db = new DAL();
    $rq = (object)getRequestBody();
    $values = [
        "username" => $rq->username,
        "firstname" => $rq->firstname,
        "lastname" => $rq->lastname,
        "usertype" => $rq->usertype,
        "password" => password_hash($rq->password,PASSWORD_BCRYPT)
    ];
    if(!$db->insert("users",$values))
        error($db->getError());
    response("New User added!");
}

function delete(){
    if(!defined('URI_PARAM'))
        error("Invalid Request! Please specify user id");
    $db = new DAL();
    $id = URI_PARAM;
    if(!$db->delete("users","id=:id",["id" => $id]))
        error($db->getError());
    response("User Deleted Successfuly!");
}

function patch(){
    if(!defined('URI_PARAM'))
        error("Invalid Request! Please specify user id");
    $db = new DAL();
    $id = URI_PARAM;
    $rq = (object)getRequestBody();
    $values = [
        "firstname" => $rq->firstname,
        "lastname" => $rq->lastname];
    $params = ["id" => $id];

    $db = new DAL();

    if(!$db->update("users","id=:id",$values,$params))
        error($db->getError());
    response("User Updated Successfuly");
}

//EOF

3. API 函数

PHPEasy 中的 API 鼓励使用过程式编程风格,

以下是在 API 实现中可以使用的函数列表

3.3 startAPI

将 PHP 文件初始化为 REST API。

调用此函数后,您可以实现 HTTP 动词作为函数。

示例

<?php
use function Core\Helper\startAPI;

startAPI();

function get(){
    //Handle GET request to api/users
}

如果您尝试使用除 GET 之外的其他 HTTP 方法进行请求,则会收到错误响应。

3.4 getRequestBody

获取请求体并将其转换为关联数组。

示例

<?php
use Core\Helper\getRequestBody;

$rq = getRequestBody();
$username = $rq["username"];
$password = $rq["password"];
//you can convert it to object for easy access
//$rq = (object)$rq;
//$username = $rq->username;
//$password = $rq->password;

3.5 validate($inputs,$validations)

根据验证规则验证键值对数组。

  • 如果有效,则返回 true;如果不有效,则退出并返回 400 状态码和错误详情。
  • 用于验证请求数据 ($_GET,$_POST)。
  • $inputs - 要验证的关联数组。
  • $validations - 包含与 $data 中的键匹配的键的关联数组,值是验证规则。

示例

<?php
use function Core\Helper\getRequestBody;
use function Core\Validator\validate;

$rq = getRequestBody();
$dataRules = ["uname" => "required|string",
    "upass" => "required|string",
    "firstName" => "required|string",
    "lastName" => "required|string"];
validate($rq,$dataRules);

3.6 error(string|array $message)

以 400 状态码和错误消息输出响应

  • $message - 字符串|数组 错误消息

3.7 response(string|array $content,int $statusCode = 200,string $contentType = 'application/json')

设置内容类型和状态码,然后输出内容并退出脚本

  • $content string|array - 要输出的内容
  • $statusCode int - 响应状态码(默认 200)
  • $contentType string - 内容类型(默认 application/json)。可用内容类型:[ application/json | plain/text | text/html ]

3.8 to($route)

包含指定的视图

  • $route string - 视图文件路径

主要用于调用 SPA 组件

3.9 redirect($path="")

重定向到指定的视图。

如果没有指定路径,则根据会话进行重定向。

  • $view string - 视图的路径

3.10 esc($string)

htmlspecialchars() 的简短语法

  • $string - 要清理的字符串
  • 用于 HTML 清理。

3.11 generateCode($length = 6)

生成一个随机的字母数字代码

  • $length - 要生成的代码长度(默认 6)

3.12 objectToSession($object)

提取对象键和值并将其存储到会话数组中

  • $object - 要提取的对象 示例
<?php
use Core\DAL;

$db = new DAL();

if(!$user = $db->getItem(1))
    invalid("User does not exist!");

objToSession($userInfo);

3.13 uploadFile($uploadFile,$uploadPath)

生成新文件名并上传文件

  • string $uploadFile $_FILE 键
  • string $uploadPath 上传文件的路径必须以 "/" 结尾
  • 返回布尔值|字符串,如果成功则返回新文件名,否则返回 false

3.14 session($sessionVar,$value = null)

获取/设置会话变量

  • $sessionVar - 会话键
  • $value - 如果为 null,则设置会话值

3.15 objArrayToValues($objArr,$item)

将对象数组转换为包含指定项值的索引数组。

  • $objArr - 要转换的对象数组
  • $item - 要提取的对象项

4. 与数据库一起工作

PHPEasy 介绍了用于数据库操作的 DAL() 类。支持 MYSql、MSSql 和 SQLite。

在 Config/Database.php 中设置数据库配置

以下是 DAL() 函数

4.1 初始化

$db = new DAL();

4.2 insert

执行 INSERT 语句;

  • $table - 要插入的表名
  • $values - 包含与表字段匹配的键的关联数组以及要插入的值。
  • 返回布尔值

示例

$values = ["username" => $uname,
    "password" => $upass,
    "firstname" => $firstName,
    "lastname" => $lastName];
$db->insert("users",$values);

4.3 update

执行更新语句

  • string $table 要更新的表
  • string $condition 条件例如 id = :id
  • array $values 要更新的值的关联数组例如 .["age" => 27]
  • array $params 条件的值例如 . ["id" => 1]
  • 返回布尔值

示例

$values = [
    "firstname" => $firstName,
    "lastname" => $lastName];
$params = ["id" => 1];

$db = new DAL();

$db->update("users","id=:id",$values,$params);

4.4 delete

执行删除语句

  • string $table 要从其删除的表
  • string $condition 使用预处理语句的查询条件,例如:id = :id AND name = :name
  • array $params 条件的值,例如:["id" => 1,"name" => "Juan Dela Cruz"]
  • 返回布尔值

示例

$delete("users","id=:id",["id" => 1]);

4.5 getItems

选择多个项目

  • string $query 选择语句
  • array $inputs 预处理语句的参数,默认(null)
  • 返回数组|false

示例

$db = new DAL();

$sql = "SELECT * FROM users WHERE lastname = :surname";
$params = ["surname" => $lastName];

$users = $db->getItems($sql,$params);

4.6 getItem

选择单行查询

  • string $query 选择语句
  • array $inputs 预处理语句的参数,默认(null)
  • 返回对象|false

示例

$db = new DAL();

$sql = "SELECT * FROM users WHERE id=:userId";
$params = ["userId" => 1];

$users = $db->getItem($sql,$params);

4.7 startTrans()

开始数据库事务。

4.8 commit()

提交数据库事务。

  • 在api返回响应之前放置此操作。

4.9 rollback()

回滚数据库事务。

  • 很少使用,因为当您在未调用commit()的情况下退出脚本时,
  • rollback()将被自动执行。

4.10 getError()

返回数据库错误

  • 一个非常有用的调试工具。

4.11 lastId($field=null)

获取数据库中插入的最后ID

  • string $field 指定lastId字段,默认null

4.12 getDriver()

获取当前使用的数据库驱动。

 - api/getAllUser.php
```php
<?php
$db = new DAL();
$users = new Users($db);

$usersList = $users->getAll();

您可以根据项目需求使用或不用模型。

DAL类可以直接在api文件中访问,您可以直接在api实现中执行查询,而无需创建模型。

5. 进阶

PHPEasy是进阶的,如果您喜欢,可以添加模型、服务,只需更新composer.json文件,如果添加了其他目录。

6. 扩展

参考

  • js帮助器:public/js/vanscript.js
  • css:public/css/mystyle.css