创建接口
定义路由后我们可以在任何类和方法中编写接口逻辑,为了统一架构,推荐将接口类放置在对应应用中的 Api
目录。
定义接口
接口类使用中间件和注解来定义路由,因此不需要继承任何类,并且需要使用 send
函数将数据返回输出给请求方:
<?php
namespace App\Example\Api;
use App\Express\Models\Express;
use Dux\App;
use Dux\Route\Attribute\Route;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class Test
{
public function list(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
{
return send($response, 'ok');
}
}
创建路由
路由使用注解类进行定义,可将类作为路由组,方法作为路由处理,如下:
<?php
namespace App\Example\Api;
use App\Express\Models\Express;
use Dux\App;
use Dux\Route\Attribute\Route;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Dux\Route\Attribute\Route;
use Dux\Route\Attribute\RouteGroup;
#[RouteGroup(app: 'api', pattern: '/example/test')] class Test
{
#[Route(methods: 'GET', pattern: '')] public function list(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
{
return send($response, 'ok');
}
}
也可以单独使用方法作为路由:
<?php
namespace App\Example\Api;
use App\Express\Models\Express;
use Dux\App;
use Dux\Route\Attribute\Route;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Dux\Route\Attribute\Route;
use Dux\Route\Attribute\RouteGroup;
class Test
{
#[Route(methods: 'GET', pattern: '/example/test', app: 'api')] public function list(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
{
return send($response, 'ok');
}
}
注解方法
使用 RouteGroup()
注解类注册路由组时可用参数如下:
参数 | 类型 | 必填 | 默认 | 说明 |
---|---|---|---|---|
app | string | * | 路由注册名 | |
pattern | string | * | 路由前缀 | |
middleware | array | 中间件扩展,可传递多个中间件的类名 |
使用 Route()
注解类注册路由时可用参数如下:
参数 | 类型 | 必填 | 默认 | 说明 |
---|---|---|---|---|
methods | array|string | * | 请求方法,GET、POST 等常用方法 | |
pattern | string | * | 路由定义 | |
name | string | 路由名,留空则自动根据"类名.方法名" 生成路由名 | ||
app | string | 路由注册名,如果类未定义 RouteGroup 注解则必填 |
路由方法
路由使用 slimphp 作为路由,可查看 slim 的路由等具体方法调用:
Read more in Slim website
<?php
namespace App\Example\Api;
use App\Express\Models\Express;
use Dux\App;
use Dux\Route\Attribute\Route;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Dux\Route\Attribute\Route;
use Dux\Route\Attribute\RouteGroup;
#[RouteGroup(app: 'api', pattern: '/example/test')]
class Test
{
#[Route(methods: 'GET', pattern: '')]
public function list(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
{
// 获取 get 请求
$params = $request->getQueryParams();
// 获取 post 请求
$data = $request->getParsedBody();
return send($response, 'ok', [
'params' => $params,
'data' => $data,
]);
}
}
典型示例
以下示例包含了接口常用的 CURD 操作:
<?php
namespace App\Example\Api;
use App\Express\Models\Express;
use Dux\App;
use Dux\Route\Attribute\Route;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Dux\Route\Attribute\Route;
use Dux\Route\Attribute\RouteGroup;
use Dux\Handlers\ExceptionBusiness;
#[RouteGroup(app: 'api', pattern: '/example/test')]
class Test
{
#[Route(methods: 'GET', pattern: '')]
public function list(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
{
// 获取 get 请求
$params = $request->getQueryParams();
// 定义模型
$model = Express::query();
// 根据条件查询数据
if ($params['name']) {
$model->where('name', $params['name']);
}
// 获取数据列表
$list = $model->get();
// 格式化数据
$data = format_data($list, function ($item) {
return [
'id' => $item->id,
'name' => $item->name,
];
});
return send($response, 'ok', ...$data);
}
#[Route(methods: 'GET', pattern: '/{id}')]
public function info(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
{
// 获取路由参数
$id = $args['id'];
// 获取详情
$info = Express::query()->find($id);
if (!$info) {
throw new ExceptionBusiness("数据不存在");
}
// 格式化数据
$data = format_data($info, function ($item) {
return [
'id' => $item->id,
'name' => $item->name,
];
});
return send($response, 'ok', ...$data);
}
#[Route(methods: 'POST', pattern: '')]
public function create(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
{
// 验证提交数据
$data = Validator::parser($request->getParsedBody(), [
"name" => ["required", "请输入名称"],
]);
Express::query()->create([
'name' => $data->name
]);
return send($response, '创建成功');
}
#[Route(methods: 'PUT', pattern: '/{id}')]
public function create(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
{
// 验证提交数据
$data = Validator::parser($request->getParsedBody(), [
"name" => ["required", "请输入名称"],
]);
// 获取路由参数
$id = $args['id'];
// 获取详情
$info = Express::query()->find($id);
if (!$info) {
throw new ExceptionBusiness("数据不存在");
}
// 更新数据
$info->name = $data->name;
$info->save();
return send($response, '更新成功');
}
#[Route(methods: 'DELETE', pattern: '/{id}')]
public function create(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
{
// 获取路由参数
$id = $args['id'];
// 获取详情
$info = Express::query()->find($id);
if (!$info) {
throw new ExceptionBusiness("数据不存在");
}
$info->delete();
return send($response, '删除成功');
}
}