rize / uri-template
PHP URI 模板 (RFC 6570) 支持展开和提取
0.3.8
2024-08-30 07:09 UTC
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: ~4.8.36
README
这是一个基于RFC 6570 URI模板的PHP实现。除了URI展开外,它还支持URI提取(由Google Cloud Core和Google Cloud客户端库使用)。
- Node.js/JavaScript URI模板
用法
展开
一个非常简单的用法(字符串展开)。
<?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[]=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 ) )
安装
使用 composer
{
"require": {
"rize/uri-template": "~0.3"
}
}
变更日志
- 0.2.0 添加了一个新的修饰符
%
,允许用户使用list[]=a&list[]=b
查询模式。 - 0.2.1 为
%
修饰符添加了嵌套数组支持 - 0.2.5 为
extract
方法添加了严格模式支持 - 0.3.0 通过 @Maks3w 改进了代码质量 + 为
extract
方法添加了 RFC3986 支持 - 0.3.1 通过 @corleonis 改进了
extract
方法,以解析由点分隔的两个或多个相邻变量
贡献者
代码贡献者
本项目归功于所有贡献者。[贡献].
财务贡献者
成为财务贡献者,帮助我们维持我们的社区。[贡献]
个人
组织
用您的组织支持这个项目。您的标志将在这里显示,并附有链接到您的网站。[捐赠]