创建接口

定义路由后我们可以在任何类和方法中编写接口逻辑,为了统一架构,推荐将接口类放置在对应应用中的 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() 注解类注册路由组时可用参数如下:

参数类型必填默认说明
appstring*路由注册名
patternstring*路由前缀
middlewarearray中间件扩展,可传递多个中间件的类名

使用 Route() 注解类注册路由时可用参数如下:

参数类型必填默认说明
methodsarray|string*请求方法,GET、POST 等常用方法
patternstring*路由定义
namestring路由名,留空则自动根据"类名.方法名" 生成路由名
appstring路由注册名,如果类未定义 RouteGroup 注解则必填

路由方法

路由使用 slimphp 作为路由,可查看 slim 的路由等具体方法调用:

<?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, '删除成功');
    }
}