noa/router

一个简单的PHP路由器,用于处理复杂的路由模式

1.1.1 2017-09-19 13:26 UTC

This package is not auto-updated.

Last update: 2024-09-29 04:09:00 UTC


README

Build Status codecov

另一个路由器

这是一个简单的PHP路由器,用于处理复杂的路由模式

描述

提供了一种简单的方式来处理参数化路由,符合PSR-7规范。

安装

composer require noa/router

用法

如何创建一个路由器

路由器处理路由,您必须在添加路由之前创建路由器。

<?php
require_once vendor/autoload.php

use Noa\Router\Router;

$router = new Router();

获取路由器实例

您也可以通过静态调用获取路由器实例,带或不带自定义配置

$router = Router::getInstance();

当您想要销毁此实例以创建一个新的实例时,只需

Router::destroy();

如何定义路由

路由是一组三个属性

  • 与路由匹配的HTTP动词
  • 路由的路径模式
  • 匹配时调用的函数

您可以定义任意多的路由。

例如,这里有一个 DummyController

namespace Noa\Router\Example;


class DummyController
{
    public function testGet() {
         return 'success Get';
    }

    public function testPut() {
        return 'success Put';
    }

    public function testPost() {
        return 'success Post';
    }

    public function testDelete() {
        return 'success Delete';
    }

    public function testWithParameter($param) {

        return 'success '.$param;
    }

    public function testWithMoreParameter($param, $param2) {

        return 'success '.$param.':'.$param2;
    }

    public function testWithMoreParameterConstraint($param, $param2) {

        return 'success constraint '.$param.':'.$param2;
    }
}

简单的GET路由

这是可能的最简单的路由

$router->get('/test/closure', function (){
    return 'success closure';
});

控制器

在闭包之外,您可以使用类方法作为控制器

可调用必须遵循此模式

\Namespace\Of\Class\ClassName#method

与HTTP动词匹配的模式

一个模式可以匹配多个HTTP动词,当然,您可以将相同的控制器关联到所有这些动词。

$router->get('/object', 'Noa\Router\Example\DummyController#testGet');
$router->put('/object', 'Noa\Router\Example\DummyController#testPut');
$router->post('/object', 'Noa\Router\Example\DummyController#testPost');
$router->delete('/object', 'Noa\Router\Example\DummyController#testDelete');

参数化路由

您可以通过在路由部分之前添加分号来参数化。因此,所有类似以下URL的路由都将匹配此路由

  • /test/test
  • /test/12
  • /test/whatever

将匹配此路由

$router->get('/object/:param', 'Noa\Router\Example\DummyController#testWithParameter');

同样的结果也可以通过闭包实现。

$router->get('/object/closure/:param', function ($param){
    return 'success closure '.$param;
});

参数约束

有时您只想在参数匹配特定正则表达式时匹配路由,with方法允许对参数(以":"开始的路由部分)添加约束

这两个路由具有相同的动词和相同的模式,但由于对:param2的约束,被视为不同的路由

您可以按需链式添加任意多的约束。

$router->get('/object/:id/:method/:param', 'Noa\Router\Example\DummyController#testWithMoreParameterConstraint')
    ->with('method', '[a-z]+')
    ->with('param', '[0-9]+')
    ->with('id', '[0-9]+');

$router->get('/object/:id/:method', 'Noa\Router\Example\DummyController#testWithMoreParameter');

启动路由匹配器

run方法将调用路由控制器,如果请求URL和HTTP动词与某个路由匹配

run方法的返回值将是控制器返回的值,您可以根据需要处理这个返回值。

在这个例子中,我们只回显这个返回值。

如果没有路由匹配,将抛出异常。

try {

    echo $router->run();
    
} catch (\Noa\Router\RouterException $e) {

    switch ($e->getCode()) {
        case \Noa\Router\RouterException::ROUTE_NOT_FOUND:
            // Some 404 page
            break;
        default:
            // Something else
            break;
    }
}

所有这些代码都包含在example文件夹中。

您可以使用PHP内部服务器

cd example
php -S localhost:8082 -t .

然后,您可以使用curl或Postman来测试路由匹配

PSR-7

此路由器符合PSR-7规范。这意味着您将接收到一个符合PGP-FIG描述的Request对象,并返回一个也符合PSR-7规范的Response。

有两个函数可以返回这些对象

第一个是只读的,处理服务器接收到的所有参数。

$request=Router::getRequest();

第二个允许在返回之前将数据设置到响应中。

$response=Router::getResponse();

有关更多信息,请参阅此处