codeinc/router

此包已被废弃且不再维护。没有建议的替代包。

Code Inc. PSR7 & PSR15 路由库

4.0.0 2018-11-07 16:00 UTC

README

此库提供了一个兼容 PSR-7PSR-15 的路由器。路由器是一个负责选择适当的控制器(实现 ControllerInterface)的组件。它作为 PSR-15 中间件MiddlewareInterface)运行。

解析器

为了选择控制器,路由器依赖于解析器(实现 ResolverInterface)。解析器负责将 URI 路径(称为路由)与控制器匹配,反之亦然,将控制器映射到路由。提供了两种解析器,StaticResolver,它使用预设的模式列表(由 fnmatch() 解析的 shell 模式)匹配处理器的类,以及 DynamicResolver,它基于 PHP 命名空间和基本 URI 动态计算路由。您可以使用 ResolverAggregator 将多个解析器配对。外部包提供基于 Doctrine 的注解 或基于 接口 的解析器。

用法

基本用法

<?php
use CodeInc\Router\Router;
use CodeInc\Router\ControllerInterface;
use CodeInc\Router\Resolvers\StaticResolver;

// dummy classes 
final class MyInstantiator implements ControllerInterface {}
final class HomePage implements ControllerInterface {}
final class License implements ControllerInterface {}
final class Article implements ControllerInterface {}

// instantiating the router
$myRouter = new Router(
    new StaticResolver([
        '/' => HomePage::class,
        '/license.txt' => License::class,
        '/article-[0-9]/*' => Article::class
    ])
);

// controller lookup (assuming the URI of the request is "/article-2456/a-great-article.html") 
$myRouter->process($aPsr7ServerRequest, $aFallbackHandler); // <-- returns 'ArticleController'

使用多个解析器和多个实例化器

<?php
use CodeInc\Router\Router;
use CodeInc\Router\ControllerInterface;
use Doctrine\Instantiator\InstantiatorInterface;
use CodeInc\Router\Resolvers\ResolverAggregator;
use CodeInc\Router\Resolvers\StaticResolver;
use CodeInc\Router\Resolvers\DynamicResolver;

// dummy classes 
final class MyFirstInstantiator implements InstantiatorInterface {}
final class MySecondInstantiator implements InstantiatorInterface {}
final class HomePage implements ControllerInterface {}
final class License implements ControllerInterface {}
final class Article implements ControllerInterface {}

// instantiating the router
$myRouter = new Router(
    new ResolverAggregator([
        new StaticResolver([
            '/' => HomePage::class,
            '/license.txt' => License::class,
            '/article-[0-9]/*' => Article::class
        ]),
        new DynamicResolver(
            'MyApp\\MyHandlers', // <-- handlers base namespace
            '/my-app/' // <-- handlers base URI
        )
    ])
);

// processing the response
$myRouter->process($aPsr7ServerRequest, $aFallbackHandler); 

安装

此库可通过 Packagist 获得,并可以使用 Composer 安装。

composer require codeinc/router

许可

此库在 MIT 许可下发布(请参阅 LICENSE 文件)。