nonaje/quill

此包最新版本(0.1.0)没有可用的许可证信息。

一个用于创建轻量级PHP API的简单框架

维护者

详细信息

github.com/nonaje/quill

源代码

问题

安装: 8

依赖项: 0

建议者: 0

安全: 0

星星: 3

关注者: 1

分支: 0

开放问题: 0

类型:项目

0.1.0 2024-04-04 19:02 UTC

This package is auto-updated.

Last update: 2024-09-09 20:22:12 UTC


README

这份文档正在更新中,并每天都会更新。

这是框架的开发版本,使用时请自担风险。

Quill

一种简单的方式来创建轻量级PHP API

安装

推荐通过 Composer 安装 Quill。

composer require nonaje/quill

基本用法

我们可以使用与 Express.Js 相似的语法使用 Quill

<?php

declare(strict_types=1);

use Quill\Contracts\Request\RequestInterface;
use Quill\Contracts\Response\ResponseInterface;

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

define('QUILL_START', microtime(true));

$app = quill();

$router = $app->router();

$router->get('/', function (RequestInterface $req, ResponseInterface $res): ResponseInterface {
    return $res->json(['execution_time' => microtime(true) - QUILL_START]);
});

$app->up();

没有必要指定数据类型,这是开发者的决定。

在 Quill 中,我们认为这是一个好的实践。

了解特性

如今 Quill 有几个特性可以简化 API 开发任务,我们希望在不久的将来添加更多。

路由器

可以使用以下 HTTP 方法映射路由

use Quill\Contracts\Request\RequestInterface;
use Quill\Contracts\Response\ResponseInterface;

$router->get('/', fn (RequestInterface $req, ResponseInterface $res): ResponseInterface => $res->json([
    'HTTP Method' => $req->psrRequest()->getMethod()
]));

$router->post('/', fn (RequestInterface $req, ResponseInterface $res): ResponseInterface => $res->json([
    'HTTP Method' => $req->psrRequest()->getMethod()
]));

$router->put('/', fn (RequestInterface $req, ResponseInterface $res): ResponseInterface => $res->json([
    'HTTP Method' => $req->psrRequest()->getMethod()
]));

$router->patch('/', fn (RequestInterface $req, ResponseInterface $res): ResponseInterface => $res->json([
    'HTTP Method' => $req->psrRequest()->getMethod()
]));

$router->delete('/', fn (RequestInterface $req, ResponseInterface $res): ResponseInterface => $res->json([
    'HTTP Method' => $req->psrRequest()->getMethod()
]));

递归分组

此外,还可以创建路由分组。

如以下所示,还可以创建递归分组。

use Quill\Contracts\Router\RouterInterface;
use Quill\Contracts\Request\RequestInterface;
use Quill\Contracts\Response\ResponseInterface;

$router->group('/api/', function (RouterInterface $router): void {

    $router->get('/foo', fn (RequestInterface $req, ResponseInterface $res): ResponseInterface => $res->json([
        'URI' => $req->psrRequest()->getUri()->getPath()
    ]));

    $router->group('/examples', function (RouterInterface $router) {

        $router->get('/group-inside-group', fn(RequestInterface $req, ResponseInterface $res): ResponseInterface => $res->json([
            'URI' => $req->psrRequest()->getUri()->getPath()
        ]));
    });
});

隔离路由文件

为了更方便和易于阅读代码,可以将分组/路由分开到单独的文件中,如下所示

通过全局函数 'path()',更容易指明 'examples.php' 路由文件的位置。

use Quill\Contracts\Router\RouterInterface;

$router->group('/api/', function (RouterInterface $router): void {

    $examplesRoutes = path()->routeFile('examples.php');
    $router->loadRoutesFrom($examplesRoutes);
});

文件 '/routes/examples.php' 看起来是这样的

<?php

use Quill\Contracts\Request\RequestInterface;
use Quill\Contracts\Response\ResponseInterface;
use Quill\Contracts\Router\RouterInterface;

return function (RouterInterface $router): void {
    $router->group('/examples', function (RouterInterface $router) {

        $router->get('/group-inside-group',
            fn(RequestInterface $req, ResponseInterface $res): ResponseInterface => $res->json([
                'URI' => $req->psrRequest()->getUri()->getPath()
            ])
        );

        $router->get('/another-route-inside-group',
            fn(RequestInterface $req, ResponseInterface $res): ResponseInterface => $res->json([
                'URI' => $req->psrRequest()->getUri()->getPath()
            ])
        );
    });
};