nonaje / quill
此包最新版本(0.1.0)没有可用的许可证信息。
一个用于创建轻量级PHP API的简单框架
0.1.0
2024-04-04 19:02 UTC
Requires
- nyholm/psr7: ^1.8
- nyholm/psr7-server: ^1.1
- psr/http-message: ^2.0
- psr/http-server-handler: ^1.0
- psr/http-server-middleware: ^1.0
Requires (Dev)
- pestphp/pest: ^2.34
- symfony/var-dumper: ^7.0
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() ]) ); }); };