willitscale/streetlamp

一个 HTTP 路由应用程序包装器。

0.3.2 2024-02-18 22:58 UTC

This package is auto-updated.

Last update: 2024-09-19 00:19:36 UTC


README

GitHub Workflow Status (with branch) Packagist License Packagist Version GitHub last commit

目录

1. 简介

Streetlamp 是一个简单的路由库,允许您快速原型化 API。这个库是基于注解路由的基本概念构建的,这在 Java 库(如 JAX-RSSpring)中很常见。尽管它的工作方式受到上述 Java 库的启发,但它有一个更适合 PHP 语言的独特实现。

2. 预先条件

为了跟上现代标准,这个库是用 PHP 8.2 构建的,因此只能在 said 环境或更高版本中运行。如果有足够的需求,我可能愿意将其改回到 PHP 8,但由于它使用了属性,所以不能回退到更早的版本。最后,这个项目需要 composer 和 PSR-4 自动加载标准

3. 设置

3.1. 安装库

只需使用 composer 命令将 Streetlamp 包含到您的项目中

composer require willitscale/streetlamp

3.2. 应用程序包装器

要运行通过 Streetlamp 包装器的应用程序,您只需要实例化 Router 类并调用 routeRouter 将使用 RouteBuilder 扫描 composer.json 中所有的命名空间(默认排除测试命名空间)并设置相应的路由。

这里是开始所需的所有代码

<?php declare(strict_types=1);

require_once 'vendor/autoload.php';

use willitscale\Streetlamp\Router;

(new Router())->route();

这将会使用一个简单的默认配置,如果您需要任何定制,可以使用 RouterConfig 实现。有关配置的完整指南请参阅 配置页面

3.3 创建控制器

可以通过给类添加 RouteController 属性来定义控制器。

<?php declare(strict_types=1);

namespace Example;

use willitscale\Streetlamp\Attributes\Controller\RouteController;

#[RouteController]
class MyRouteClass {
}

只有具有 RouteController 属性的类才会被扫描以查找路由。

3.4. 创建路由

RouteController 中的每个公共方法都可以被注解为一个路由。将方法转换为路由有三个要求

  • 给方法添加 HTTP 方法属性
  • 给方法或类添加路径属性
  • 返回 ResponseBuilder 对象

假设我们想为请求 GET /hello HTTP/1.1 创建一个路由,我们需要给路由方法添加 GetPath 属性。

代码如下所示

<?php declare(strict_types=1);

namespace Example;

use willitscale\Streetlamp\Attributes\Controller\RouteController;
use willitscale\Streetlamp\Attributes\Path;
use willitscale\Streetlamp\Attributes\Route\Method;
use willitscale\Streetlamp\Builders\ResponseBuilder;
use willitscale\Streetlamp\Enums\HttpMethod;
use willitscale\Streetlamp\Enums\HttpStatusCode;

#[RouteController]
class MyRouteClass
{
    #[Path('/hello')]
    #[Method(HttpMethod::GET)]
    public function simpleGet(): ResponseBuilder
    {
        return (new ResponseBuilder())
            ->setData('world')
            ->setHttpStatusCode(HttpStatusCode::HTTP_OK);
    }
}

我们也可以将 #[Path('/hello')] 应用到 RouteController,然后控制器中定义的所有路由都会在这个路径前缀上,因此不需要为它们单独添加路径。

4. 进一步阅读