fracture / 路由
无派发器的简单路由库
Requires
- php: >=5.5.0
- fracture/http: >=0.3.0
Requires (Dev)
- satooshi/php-coveralls: dev-master
- sebastianbergmann/phpcov: 1.1.0
This package is auto-updated.
Last update: 2024-09-16 03:37:47 UTC
README
##介绍
此组件是一个简单的路由库,旨在与其它库轻松兼容。它不包含任何派发功能。相反,它专注于将用户的输入封装在请求的抽象表示中。
##安装
您可以使用以下命令将库添加到项目中:
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);
这也可以与环境变量结合使用,以区分开发、预发布和生产环境。