rodrifarias/slim-route-attributes

Slim Route Attributes 是一个使用 PHP 属性的路线扫描器

0.4.0 2022-09-28 01:42 UTC

This package is auto-updated.

Last update: 2024-09-15 21:02:29 UTC


README

Slim Route Attributes 是一个使用 PHP 属性的路线扫描器。

安装

$ composer require rodrifarias/slim-route-attributes

使用 AppFactory 的 Hello World 示例

创建文件 public/index.php。

<?php

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

use Rodrifarias\SlimRouteAttributes\App\AppSlimFactory;
use Rodrifarias\SlimRouteAttributes\Route\Scan\ScanRoutes;

$pathDirControllers = __DIR__ . '/your-dir';

$app = AppSlimFactory::create();
$app->registerRoutes($pathDirControllers, new ScanRoutes());
$app->run();

创建控制器

<?php

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Rodrifarias\SlimRouteAttributes\Attributes\HttpMethods\Delete;
use Rodrifarias\SlimRouteAttributes\Attributes\HttpMethods\Get;
use Rodrifarias\SlimRouteAttributes\Attributes\HttpMethods\Patch;
use Rodrifarias\SlimRouteAttributes\Attributes\HttpMethods\Post;
use Rodrifarias\SlimRouteAttributes\Attributes\HttpMethods\Put;
use Rodrifarias\SlimRouteAttributes\Attributes\Middleware;
use Rodrifarias\SlimRouteAttributes\Attributes\PublicAccess;
use Rodrifarias\SlimRouteAttributes\Attributes\Route;
use Rodrifarias\SlimRouteAttributes\Tests\Unit\Route\Middleware\MiddlewareAfter;
use Rodrifarias\SlimRouteAttributes\Tests\Unit\Route\Middleware\MiddlewareBefore;

#[Route('/')]
class HomeController
{
    #[Get, PublicAccess(true)]
    public function showAll(RequestInterface $request, ResponseInterface $response): ResponseInterface
    {
        $response->getBody()->write('Home');
        return $response->withHeader('Content-type', 'application/json');
    }

    #[Get('optional[/{id:[0-9]+}]')]
    public function optional(RequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
    {
        $id = $args['id'] ?? '';
        $response->getBody()->write('Optional' . $id);
        return $response->withHeader('Content-type', 'application/json');
    }

    #[Get('{id:\d+}'), PublicAccess(true)]
    public function show(RequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
    {
        $response->getBody()->write('Hello ' . $args['id']);
        $response->withHeader('Content-type', 'application/json');
        return $response->withStatus(200);
    }

    #[Post, Middleware([MiddlewareAfter::class, new MiddlewareBefore()])]
    public function create(RequestInterface $request, ResponseInterface $response): ResponseInterface
    {
        return $response->withHeader('Content-type', 'application/json');
    }

    #[Put('{id:\d+}')]
    public function update(RequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
    {
        $response->getBody()->write('Updated ' . $args['id']);
        return $response->withHeader('Content-type', 'application/json');
    }

    #[Delete('{id:\d+}')]
    public function delete(RequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
    {
        $response->withHeader('Content-type', 'application/json');
        return $response->withStatus(204);
    }

    #[Patch('{id:\d+}')]
    public function updatePatch(RequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
    {
        $response->getBody()->write('Updated Patch ' . $args['id']);
        return $response->withHeader('Content-type', 'application/json');
    }
}

您可以使用内置的 PHP 服务器快速测试此功能

$ php -S localhost:8000 -t public

访问 https://:8000 现在将显示 "Home"。

可用的 HTTP 方法

GET, POST, PUT, DELETE, PATCH

路由中的中间件

要运行中间件,您必须在方法中添加以下属性(Middleware)

#[Route('/home')]
class HomeController
{
    #[Get, PublicAccess(true), Middleware([MiddlewareAfter::class])]
    public function showAll(RequestInterface $request, ResponseInterface $response): ResponseInterface
    {
        $response->getBody()->write('Home');
        return $response->withHeader('Content-type', 'application/json');
    }
}

映射路由

您可以使用 map 使用多个 HTTP 方法

#[Route('/home')]
class HomeController
{
    #[Map('/map', ['POST', 'GET'])]
    public function mapPostGet(RequestInterface $request, ResponseInterface $response): ResponseInterface
    {
        $response->getBody()->write('Map With Post and Get');
        return $response->withHeader('Content-type', 'application/json');
    }
}

显示所有已注册路由的命令

$ php vendor/bin/show-routes.php show-routes --path=your-dir

获取路由列表

<?php

use Rodrifarias\SlimRouteAttributes\Route\Scan\ScanRoutes;

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

$scan = new ScanRoutes();
$routes = $scan->getRoutes(__DIR__ . '/your-dir');

// you can use getRoutes with cache
$routes = $scan->getRoutes(__DIR__ . '/your-dir', true);

foreach ($routes as $route) {
    echo $route . PHP_EOL . PHP_EOL;
}

测试

要执行测试套件,您需要安装所有开发依赖项。

$ git clone https://github.com/rodrifarias/slim-route-attributes
$ composer install
$ composer test