rize/uri-template

PHP URI 模板 (RFC 6570) 支持展开和提取

0.3.8 2024-08-30 07:09 UTC

README

这是一个基于RFC 6570 URI模板的PHP实现。除了URI展开外,它还支持URI提取(由Google Cloud CoreGoogle Cloud客户端库使用)。

CI Total Downloads Financial Contributors on Open Collective

用法

展开

一个非常简单的用法(字符串展开)。

<?php

use Rize\UriTemplate;

$uri = new UriTemplate();
$uri->expand('/{username}/profile', ['username' => 'john']);

>> '/john/profile'

Rize\UriTemplate 支持RFC6570指定的所有 表达式类型级别

<?php

use Rize\UriTemplate;

$uri = new UriTemplate();
$uri->expand('/search/{term:1}/{term}/{?q*,limit}', [
    'term'  => 'john',
    'q'     => ['a', 'b'],
    'limit' => 10,
])

>> '/search/j/john/?q=a&q=b&limit=10'

/ 路径段展开

<?php

use Rize\UriTemplate;

$uri = new UriTemplate();
$uri->expand('http://{host}{/segments*}/{file}{.extensions*}', [
    'host'       => 'www.host.com',
    'segments'   => ['path', 'to', 'a'],
    'file'       => 'file',
    'extensions' => ['x', 'y'],
]);

>> 'http://www.host.com/path/to/a/file.x.y'

Rize\UriTemplate 接受 base-uri 作为第一个参数,接受 默认参数 作为第二个参数。这在处理API端点时非常有用。

看看现实世界中的例子。

<?php

use Rize\UriTemplate;

$uri = new UriTemplate('https://api.twitter.com/{version}', ['version' => 1.1]);
$uri->expand('/statuses/show/{id}.json', ['id' => '210462857140252672']);

>> https://api.twitter.com/1.1/statuses/show/210462857140252672.json

提取

它还支持URI提取(从URI中提取所有变量)。让我们看看例子。

<?php

use Rize\UriTemplate;

$uri = new UriTemplate('https://api.twitter.com/{version}', ['version' => 1.1]);

$params = $uri->extract('/search/{term:1}/{term}/{?q*,limit}', '/search/j/john/?q=a&q=b&limit=10');

>> print_r($params);
(
    [term:1] => j
    [term] => john
    [q] => Array
        (
            [0] => a
            [1] => b
        )

    [limit] => 10
)

注意,在上面的例子中,extract方法返回的结果有一个额外的键名 term:1,用于 prefix 修饰符。这个键只是为了方便访问前缀数据而添加的。

strict 模式

<?php

use Rize\UriTemplate;

$uri = new UriTemplate();
$uri->extract($template, $uri, $strict = false)

通常,extract方法会尝试从URI中提取变量,即使它只是部分匹配。例如

<?php

use Rize\UriTemplate;

$uri = new UriTemplate();
$params = $uri->extract('/{?a,b}', '/?a=1')

>> print_r($params);
(
    [a] => 1
    [b] => null
)

strict mode 下,它只允许在模板中的变量与给定的URI完全匹配时提取URI。

这对于您想要确定给定的URI是否与您的模板匹配(如果您想将其用作路由服务)非常有用。

<?php

use Rize\UriTemplate;

$uri = new UriTemplate();

// Note that variable `b` is absent in uri
$params = $uri->extract('/{?a,b}', '/?a=1', true);

>>> null

// Now we give `b` some value
$params = $uri->extract('/{?a,b}', '/?a=1&b=2', true);

>>> print_r($params)
(
  [a] => 1
  [b] => 2
)

数组修饰符 %

默认情况下,RFC 6570只有两种运算符 :*。由于当前规范无法处理数组风格的查询,例如 list[]=akey[user]=john,因此向库中添加了此 % 数组运算符。

% 修饰符的示例用法

<?php

$uri->expand('{?list%,keys%}', [
    'list' => [
        'a', 'b',
    ),
    'keys' => [
        'a' => 1,
        'b' => 2,
    ),
]);

// '?list[]=a&list[]=b&keys[a]=1&keys[b]=2'
>> '?list%5B%5D=a&list%5B%5D=b&keys%5Ba%5D=1&keys%5Bb%5D=2'

// [] get encoded to %5B%5D i.e. '?list[]=a&list[]=b&keys[a]=1&keys[b]=2'
$params = $uri->extract('{?list%,keys%}', '?list%5B%5D=a&list%5B%5D=b&keys%5Ba%5D=1&keys%5Bb%5D=2', )

>> print_r($params);
(
    [list] => Array
        (
            [0] => a
            [1] => b
        )

    [keys] => Array
        (
            [a] => 1
            [b] => 2
        )
)

安装

使用 composer

{
    "require": {
        "rize/uri-template": "~0.3"
    }
}

变更日志

  • 0.2.0 添加了一个新的修饰符 %,允许用户使用 list[]=a&list[]=b 查询模式。
  • 0.2.1% 修饰符添加了嵌套数组支持
  • 0.2.5extract 方法添加了严格模式支持
  • 0.3.0 通过 @Maks3w 改进了代码质量 + 为 extract 方法添加了 RFC3986 支持
  • 0.3.1 通过 @corleonis 改进了 extract 方法,以解析由点分隔的两个或多个相邻变量

贡献者

代码贡献者

本项目归功于所有贡献者。[贡献].

财务贡献者

成为财务贡献者,帮助我们维持我们的社区。[贡献]

个人

组织

用您的组织支持这个项目。您的标志将在这里显示,并附有链接到您的网站。[捐赠]