wayn3r / php-server
基于 express.js 的 PHP API 创建服务器
This package is auto-updated.
Last update: 2024-09-18 07:30:14 UTC
README
这是一个受 express.js 启发的 PHP 路由器,用于创建 API
基本用法示例
在项目入口文件(index.php)中
<?php
require_once <project-root> '/vendor/autoload.php';
$app = \Http\Server::getServer();
$app->get('/',
function(\Http\Request $req, \Http\Response $res){
$res->send('Hello world');
}
);
$app->start();
为了使此路由器正常工作,所有对服务器的请求都必须由项目入口文件(index.php)处理。
这可以通过使用 PHP 启动服务器的命令来实现
php -S localhost:8080 -c php.ini index.php
如果你使用 Apache,你可以通过 .htaccess 文件来实现这一点
RewriteEngine on
RewriteRule ^(.*)$ index.php [L,QSA,E=REQUEST_URI:/$1]
相对路由
你可以使用 \Http\Router 实例,并将其作为中间件在应用程序中使用来利用相对路由,就像在 express 中做的那样。
在 router.php 文件中
<?php
$router = new \Http\Router;
$router->get('/', function(\Http\Request $req, \Http\Response $res){
$res->json([
'message' => 'Hello world from user router'
]);
});
return $router;
在 index.php 文件中
<?php
require_once <project-root> '/vendor/autoload.php';
$userRouter = require('router.php');
$app = \Http\Server::getServer();
$app->use('/user', $userRouter);
$app->start();
查询、请求体和 URL 参数的使用
为了访问查询参数和请求体中的参数,\Http\Request 提供了 query() 和 body() 两个方法。
<?php
$router = new \Http\Router;
$router->get('/', function(\Http\Request $req, \Http\Response $res){
$query = $req->query();
$body = $req->body();
$res->json([
'query' => $query,
'body' => $body
]);
});
return $router;
你也可以像 express 那样通过 URL 接收数据
<?php
$router = new \Http\Router;
$router->get('/:id', function(\Http\Request $req, \Http\Response $res){
['id' => $id] = $req->params();
$query = $req->query();
$body = $req->body();
$res->json([
'query' => $query,
'body' => $body,
'id' => $id
]);
});
return $router;
要指定一个 URL 参数,你需要添加一个 : 符号,然后是参数名。注意,: 必须始终位于 / 符号之后,否则可能会产生不期望的行为,例如:
/user/:id -> id 是一个必需的 URL 参数,用于匹配控制器。/user:id -> 需要 /user:id 这样的请求来匹配控制器。
中间件的使用
中间件的处理方式与控制器相同,实际上,实现逻辑的不同是区分两者的关键。所有控制器都接收 \Http\Request、\Http\Response 和一个可调用的参数,最后一个参数与 express 的 next 函数类似,它将你带到队列中的下一个控制器。这个可调用的参数可以接收用户想要的任何数量的参数,并在传递给下一个控制器之前传递给 \Http\Request。这很重要,因为是否向 next 函数传递参数会改变下一个控制器接收到的参数的顺序,让我们看一个例子
<?php
$router = new \Http\Router;
$router->get('/', function(\Http\Request $req, \Http\Response $res, callable $next){
$id = $req->query()['id'];
if(!$id) return $next('El parametro id es requerido');
$res->json([
'id' => $id
]);
});
$router->post('/', function(\Http\Request $req, \Http\Response $res, callable $next){
$name = $req->query()['name'];
if(!$name) return $next('El parametro name es requerido');
$res->json([
'name' => $name
]);
});
$router->use('/', function($errors, $_, \Http\Response $res){
$res->status(400)->json([
'error' => $errors
]);
});
return $router;
与 express 一样,你还可以在请求级别添加中间件。
<?php
$router = new \Http\Router;
$router->get('/',
function(\Http\Request $req, \Http\Response $res, callable $next){
$id = $req->query()['id'];
if(!$id || !is_numeric($id))
return $res->status(400)->json([
'error' => 'ID invalido'
]);
$req->id = intval($id);
$next();
},
function(\Http\Request $req, \Http\Response $res){
$id = $req->id;
$res->json([
'id' => $id
]);
}
);
return $router;
验证器
php-server 已经包含了一些类似于 express-validator 功能的中间件。在上面的例子中,使用 Validator 将看起来像这样
注意:这个特性仍在开发中。
<?php
$router = new \Http\Router;
$validator = new \Validate\Validator;
$router->get('/',
$validator->required()->number()->query('id'),
$validator->checkout(),
function(\Http\Request $req, \Http\Response $res){
$id = intval($req->query()['id']);
$res->json([
'id' => $id
]);
}
);
return $router;