rudra/router

Rudra 框架

2024 2024-02-27 14:13 UTC

This package is auto-updated.

Last update: 2024-09-19 12:01:27 UTC


README

PHPunit Scrutinizer Code Quality Code Climate CodeFactor

Code Intelligence Status Latest Stable Version Total Downloads GitHub

Rudra-Router

为 http GET 方法安装路由 callback/:name

执行 lambda 函数

$router->get('callback/:name', function ($name) {
    echo "Hello $name!";
});

通过 Rudra-Container 门面调用

use Rudra\Router\RouterFacade as Router;

Router::get('callback/:name', function ($name) {
    echo "Hello $name!";
});

调用 MainController::read

$router->get('read/:id', [MainController::class, 'read']);

通过向 MainController 添加注解调用 MainController::read

/**
 * @Routing(url = ''read/:id')
 */
public function read($id)

调用 MainController::read 并根据键 before 或 after 分别添加 middleware

$router->get('read/page',  [MainController::class, 'read'], ['before'  => [Middleware::class]);

在注解中

/**
 * @Routing(url = 'read/page')
 * @Middleware(name = 'App\Middleware\Middleware')
 */
public function read()

要收集注解,需要将包含注解的类数组传递给 annotationCollector

$router->annotationCollector([
    \App\Controllers\MainController::class,
    \App\Controllers\SecondController::class,
]);
Router::annotationCollector([
    \App\Controllers\MainController::class,
    \App\Controllers\SecondController::class,
]);

带 middleware 参数

$router->get('', [MainController::class, 'read'], [
    'before' => [FirstMidddleware::class, [SecondMidddleware::class, ['int' => 456, new \stdClass]]],
    'after'  => [FirstMidddleware::class, [SecondMidddleware::class, ['int' => 456, new \stdClass]]]
]);

在注解中

/**
 * @Routing(url = '')
 * @Middleware(name = 'App\Middleware\FirstMidddleware')
 * @Middleware(name = 'App\Middleware\SecondMidddleware', params = {int : '456'})
 * @AfterMiddleware(name = 'App\Middleware\FirstMidddleware')
 * @AfterMiddleware(name = 'App\Middleware\SecondMidddleware', params = {int : '456'})
 */
public function read()

在传递参数到 middleware 时,需要添加参数 "array $params"

public function __invoke(array $params, array $middlewares)

如果未传递参数,则

public function __invoke(array $middlewares)

以下不带参数的调用等于

'before' => [FirstMidddleware::class, SecondMidddleware::class]],
'before' => [[FirstMidddleware::class], [SecondMidddleware::class]]

为 http POST 方法安装路由 create/:id

调用 MainController::create

$router->post('create/:id', [MainController::class, 'create']);

在注解中

/**
 * @Routing(url = 'create/:id', method = 'POST')
 */
public function create($id)

为 http PUT 方法安装路由 update/:id

调用 MainController::update

$router->put('update/:id', [MainController::class, 'update']);

在注解中

/**
 * @Routing(url = 'update/:id', method = 'PUT')
 */
public function update($id)

为 http PATCH 方法安装路由 update/:id

调用 MainController::update

$router->patch('update/:id', [MainController::class, 'update']);

在注解中

/**
 * @Routing(url = 'update/:id', method = 'PATCH')
 */
public function update($id)

为 http DELETE 方法安装路由 delete/:id

调用 MainController::delete

$router->delete('delete/:id', [MainController::class, 'delete']);

在注解中

/**
 * @Routing(url = 'delete/:id', method = 'DELETE')
 */
public function delete($id)

为 http GET|POST|PUT|PATCH|DELETE 方法安装路由 any/:id

调用 MainController::any

$router->any('any/:id', [MainController::class, 'any']);

在注解中

/**
 * @Routing(url = 'any/:id', method = 'GET|POST|PUT|PATCH|DELETE')
 */
public function any($id)

为 api/:id 路由安装资源,方法 GET|POST|PUT|DELETE

为 GET 调用 MainController::read

为 POST 调用 MainController::create

为 PUT 调用 MainController::update

为 DELETE 调用 MainController::delete

$router->resource('api/:id', MainController::class);

可以通过传递一个包含你名称的数组来更改控制器的默认方法

$router->resource('api/:id', MainController::class, ['actionIndex', 'actionAdd', 'actionUpdate', 'actionDrop']);
使用 set 方法声明路由的示例

为 http DELETE|PUT 方法安装路由 /test/:id

执行 lambda 函数

$router->set(['/test/page', 'POST|PUT', function () {
            echo 'Hello world!';
        }
]);

调用 MainController::actionIndex

$router->set(['/test/:id', 'DELETE|PUT', [MainController::class, 'actionIndex'], [
        'before' => [First::class, Second::class],
        'after'  => [[First::class], [Second::class]]
]]);

Middleware 示例

<?php

namespace App\Middleware;

use Rudra\Router\Router;
use Rudra\Router\MiddlewareInterface;

class FirstMiddleware extends Router implements MiddlewareInterface
{
    public function __invoke(array $middlewares)
    {
        $this->next($middlewares);
    }

    public function next(array $middlewares): void
    {
        $this->handleMiddleware($middlewares);
    }
}

使用门面使用参数的 Middleware 示例

<?php

namespace App\Middleware;

use Rudra\Router\MiddlewareInterface;
use Rudra\Router\RouterFacade as Router;

class SecondMiddleware implements MiddlewareInterface
{
    public function __invoke(array $middlewares, array $params)
    {
        var_dump($params);
        $this->next($middlewares);
    }
    
    public function next(array $middlewares): void
    {
        Router::handleMiddleware($middlewares);
    }
}