ozdemirrulass/uri-template

增强型PHP URI模板(RFC 6570)支持扩展和提取

v1.0.0 2024-05-12 22:25 UTC

This package is auto-updated.

Last update: 2024-09-12 23:12:48 UTC


README

这是一个基于RFC 6570 URI模板的PHP实现。除了URI扩展,它还支持URI提取。

  • 此存储库是rize/UriTemplate的严格类型、更简洁的版本。
  • 为确保包正常工作,测试与原始版本完全一致。

安装

通过 composer 安装

composer require ozdemirrulass/uri-template

用法

扩展

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

<?php

use Ozdemirrulass\UriTemplate;

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

>> '/john/profile'

Ozdemirrulass\UriTemplate 支持 RFC6570 规范中指定的所有 表达式类型级别

<?php

use Ozdemirrulass\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 Ozdemirrulass\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'

Ozdemirrulass\UriTemplate 接受 base-uri 作为第一个参数,并将 默认参数 作为第二个参数。当你与API端点一起工作时,这非常有用。

看看现实世界的示例。

<?php

use Ozdemirrulass\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 Ozdemirrulass\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 Ozdemirrulass\UriTemplate;

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

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

<?php

use Ozdemirrulass\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 Ozdemirrulass\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
        )
)