phpnova/rest

用于处理HTTP请求的库

此包的官方仓库似乎已丢失,因此该包已被冻结。

dev-main 2023-04-29 13:50 UTC

This package is auto-updated.

Last update: 2023-12-29 15:22:55 UTC


README

  • PHP ^8.2.0
  • 本地服务器,可以是xammp、wanserver、symfony

建议使用symfony启动测试服务器

配置

app.json

app.config文件包含应用程序的基本配置

{
    "version": "1.0.0.BETA",
    "src": "src/",
    "files": "files/",
    "databases": {
        "my_db": {
            "type": "mysql",
            "timezone": "+00:00"
        }
    }
}

app.env.json

app.env.json文件包含应用程序运行时的环境配置,因此不建议将该文件存放在仓库中,因为这些数据会根据部署的位置而变化。

内容涉及API的CORS和数据库连接数据。

如果在运行应用程序时检测到app.env.json文件不存在,则会自动根据app.json的初始配置创建该文件。

{
    "cors": {
        "/": "*"
    },
    "databases": {
        "my_db": {
            "host": "localhost",
            "user": "root",
            "password": "",
            "database": "db_name"
        }
    }
}

Index.php

应用程序入口

请记住配置您的.htaccess文件,以便将URL入口指向index.php

基本示例

RewriteEngine On
RewriteRule ^(.*) index.php [L,QSA
<?php

use Phpnova\Rest\AppConfig;
use Phpnova\Rest\Application;
use Phpnova\Rest\Routing\Router;

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

$app = new Application();
$app->use('/', fn() => require __DIR__ . '/app/router.php');
$app->setHandleRequest(require __DIR__ . '/app/Config/HandleResponse.php');
$app->setHandleError(require __DIR__ . '/app/Config/HandleErrors.php');
$app->setHandleException(require __DIR__ . '/app/Config/HandleException.php');
$app->run();

定义路由

路由是通过Phpnova\Rest\Routing\Router::class类的静态方法定义的。

use Phpnova\Rest\Http\Request;
use Phpnova\Rest\Http\Response;
use Phpnova\Rest\Routing\Router;

Router::get(path: 'hola-mundo', function(){
    return "Hola mundo";
});
Router::post(path: 'hola-mundo', function(){
    return "Hola mundo POST";
});

# Sub rutas
Router::use('/saludar', function(){
    Router::get('/', function() {
        return "Hola, ¿Como estas?";
    });

    # Con parametros en la ruta utilizaremos : mas el nombre
    Router::get('/:name', function(string $name){
        return "Hola $name, ¿Como estas?";
    });
});

控制器

控制器是针对每个路由要执行的函数,可以在注册路由时定义,也可以引用存储方法的类。

函数示例

# En este haca la función se ejecutar para entrada `/saludar/:name/`
# Ruta ingresada de prueba `/saludar/Johan/`

function(){
    return "Hola, ¿Como estas?";
}
# Salia resultante: "Hola, ¿Como estas?"

要访问在URL中定义的参数

# Si quicerarmos haceder al parametro de la ruta `:name`,
# basta un parametro en la función con el mismo nombre
function(string $name){
    return "Hola $name, ¿Como estas?";
}
# Salida resultante: "Hola Johan, ¿como estar?"

要访问查询的更多信息,我们需要定义一个类型为Phpnova\Rest\Http\Request的参数。

function(Phpnova\Rest\Http\Request $req){
    return "Hola";
}

要将body内容加载到函数的参数中,请使用Phpnova\Rest\Http\Body属性,并将其放在要加载内容的参数之前。

use Phpnova\Rest\Http\Body

function(#[Body]mixed $body){
    return $body;
}

任何引用类的参数都会自动实例化,因此建议不要在类的构造函数中请求参数,以确保正确运行。