我一直在研究PSR-7 UriInterface的实现,以及关于何时实现应该为某些组件抛出InvalidArgumentException的规范有点令人费解。
例如,UriInterface::withPath specifies throwing such an exception given an invalid path,但同一个docblock指出,“用户可以提供编码和解码的路径字符”,因为“实现确保正确的编码。”
/**
* ...
*
* Users can provide both encoded and decoded path characters.
* Implementations ensure the correct encoding as outlined in getPath().
*
* @param string $path The path to use with the new instance.
* @return static A new instance with the specified path.
* @throws \InvalidArgumentException for invalid paths.
*/
负责管理编码的实现在整个规范的其余部分都得到了证实。
由于实现确保了正确的编码,因此似乎可以遵循实现的用户可以将任意数量的无效字符传递给像withPath这样的函数,然后对其进行正确编码而不是触发异常。
我能想到的唯一一个案例就是InvalidArgumentException,如果withPath传递了一个非字符串(无论它值多少,似乎都是Guzzle's interpretation of the specification)。
真正严格阅读PHP's brief introduction of InvalidArgumentException似乎可以避免这种“严格打字”的解释,但我不禁想知道PHP-FIG是否有任何其他想法,特别是考虑到复杂性一般的URI语法。
是否存在UriInterface方法(如withPath)在传递字符串时会抛出异常的情况?
答案 0 :(得分:1)
我知道,你的问题有点陈旧: - )
你的假设是完全正确的!
关于部分:
用户可以提供编码和解码的路径字符。
实现确保了getPath()中概述的正确编码。
这与"无效路径"无关。 (在@throws
标签中描述)。它只是声明 - 正如你所声称的那样,用户可以提供编码和解码的字符,这些字符是正确的 - 在相应 - 百分比编码的意义上。例如。一些不编码的字符将被百分比编码,而其他字符则不会。原则上,编码方案是:
Percent-encode all URI path characters, except:
- the unreserved characters,
- the reserved characters of the subset "gen-delims",
- the reserved characters of the subset "sub-delims",
- the already percent-encoded characters.
另一方面,异常 - InvalidArgumentException
- 被抛出以下参数'无效的情况:
withScheme
:不是字符串,不属于允许列表
方案; withHost
:不是字符串; withPort
:不是数字(或整数?)且不在[1,65535]范围内; withPath
:不是字符串; withQuery
:不是字符串; withFragment
:不是字符串; 最后,特殊处理接收作为(可选NULL)构造函数参数传递的URI字符串($uri
):
...和URI部分数组,作为在URI字符串参数上调用parse_url
的结果(此处为throw UnexpectedValueException
):
$uriParts = parse_url($uri);
if ($uriParts === FALSE) {
throw new \UnexpectedValueException('URI could not be parsed!');
}
请注意,我已在UriInterface实现中列出了所有异常抛出情况。