ozdemirrulass / uri-template
增强型PHP URI模板(RFC 6570)支持扩展和提取
v1.0.0
2024-05-12 22:25 UTC
Requires
- php: ^8.0
Requires (Dev)
- phpunit/phpunit: ^11.2@dev
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[]=a
或 key[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 ) )