fracture/路由

无派发器的简单路由库

0.3.1 2016-02-15 03:53 UTC

This package is auto-updated.

Last update: 2024-09-16 03:37:47 UTC


README

Build Status Code Coverage Scrutinizer Packagist version

##介绍

此组件是一个简单的路由库,旨在与其它库轻松兼容。它不包含任何派发功能。相反,它专注于将用户的输入封装在请求的抽象表示中。

##安装

您可以使用以下命令将库添加到项目中:

composer require fracture/routing

它还将安装 fracture/http 作为依赖项。

##使用

以下代码展示了初始化HTTP请求的抽象并路由该请求的过程。

<?php

require '/path/to/vendor/autoload.php';

/*
 * Setting up request abstraction
 */

$builder = new Fracture\Http\RequestBuilder;
$request = $builder->create([
    'get'    => $_GET,
    'files'  => $_FILES,
    'server' => $_SERVER,
    'post'   => $_POST,
    'cookies'=> $_COOKIE,
]);

$uri = isset($_SERVER['REQUEST_URI'])
           ? $_SERVER['REQUEST_URI']
           : '/';

$request->setUri($uri);

/*
 * Defining the config
 */

$configuration = [
    'primary' => [
        'notation' => '[:id]/:resource',
        'conditions' => [
            'id' => '[0-9]+',
        ],
    ],
    'fallback' => [
        'notation' => ':any',
        'conditions' => [
            'any' => '.*',
        ],
        'defaults' => [
            'resource' => 'landing',
        ],
    ],
];

/*
 * Routing the request
 */

$router = new Fracture\Routing\Router(new Fracture\Routing\RouteBuilder);
$router->import($configuration);

$router->route($request);

// The $request now is fully initialized.

var_dump($request->getParameter('resource'));

###路由定义

路由器的 import() 方法期望一个定义好的路由列表。每个路由都是一个包含 'notation' 元素的数组。它还可以有可选的 'conditions''defaults' 字段。

'primary' => [
    'notation' => ':resource[/:action]',
    'conditions' => [
        // list custom conditions
    ],
    'defaults' => [
        // list of fallback values
    ]
],

当路由器尝试将URI与定义好的路由列表进行匹配时,它从顶部元素开始迭代,直到找到匹配项或列表结束。因此,为了提高任何定义好的路由的优先级,您需要将其移动到列表的更高位置。

####符号格式

符号是用于定义要匹配的URI结构的可读格式。它包含3个可识别的部分,如以下示例所示

document[/view]/:name[.:extension]

这些部分是

  • 标记

    每个标记以冒号开头,名称仅使用英文字母(或正则表达式 :[a-zA-Z]+)书写。这种标记的形状定义在 Pattern::REGKEY

    在上面的示例中,定义的标记是 :name:extension

  • 静态文本

    这些是符号的一部分,没有直接的计算值,但仅用于结构化URI,使其更容易阅读和/或识别。

    在上面的示例中,静态文本是 document/view/.(点)。

  • 可选元素

    如果符号的任何部分被括在 [](方括号)中,它就变成了非强制性的。任何符号的部分和部分的组合都可以定义为可选元素。这也意味着可选元素可以嵌套。

    在上面的示例中,定义为可选的部分是 /view.:extension

####条件

对于每个路由,可以定义自定义条件,这些条件将期望标记匹配。默认情况下,每个标记都尝试匹配不包含 /\.,;? 的URI片段。要更改此行为,每个路由定义可以有一个可选的 conditions 元素。

条件设置为键值对数组,其中键对应于标记的名称,值包含正则表达式片段。以下是从路由配置数组中摘录的示例

'notation' => ':project/[:name]/:iteration',
'conditions' => [
    'name' => '[A-Z][a-z]+-[0-9]{2}',
    'iteration' => '[0-9]+',
],

在此示例中,您可以看到具有三个定义标记的符号,其中 :name 标记是可选的。还定义了两个自定义条件,分别分配给 :name:iteration 标记。

####默认值

当URI模式具有可选部分时,您不可避免地会收到一些缺少这些部分的请求。在这种情况下,默认情况下,Fracture\Request 在尝试检索该参数时会返回 null。但这并不总是最有用的行为。

如果您希望可选的URI部分具有定义的回退值,当片段不存在时使用这些值,可以在路由定义的末尾附加回退值定义

'notation' => ':project/[:name]',
'defaults' => [
    'name' => 'unnamed',
],

在上面的例子中,如果符号匹配,但相应的值在URI中不存在,则请求抽象将接收"unnamed"作为'name'参数的值。

此功能也可以用于为匹配的URI添加“静默参数”。

'notation' => 'verify/[:hash]',
'conditions' => [
    'hash' => '[a-z0-9]{32}',
],
'defaults' => [
    'resource' => 'registration',
    'action'   => 'complete',
],

有了这些“静默参数”,您的代码就不限于仅使用在URI中找到的字符串值。

##路由请求的使用

请参阅fracture/http的文档。

##各种技巧

###更清晰的配置

在现实世界的项目中,您的应用程序几乎总是拥有多个以上的路由。这可能会导致配置过于庞大,使得项目的初始化阶段(如启动文件)难以阅读,且内容杂乱。

为了避免这种情况,您可以把配置分离到一个专门的文件中。

<?php
// other code

$configuration = json_decode(file_get_contents(__DIR__ . '/config/routes.json'), true);

$router = new Fracture\Routing\Router(new Fracture\Routing\RouteBuilder);
$router->import($configuration);

这也可以与环境变量结合使用,以区分开发、预发布和生产环境。