0

我一直在研究PSR-7 UriInterface的实现,关于实现何时应该为某些组件抛出 InvalidArgumentException 的规范有点令人费解。

例如,UriInterface::withPath 指定在给定无效路径的情况下抛出这样的异常,但相同的文档块指出,“用户可以提供编码和解码的路径字符”,因为“实现确保正确的编码”。

/**
 * ...
 *
 * 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 对规范的解释)。

真正严格阅读PHP 对 InvalidArgumentException 的简要介绍似乎可以避免这种“严格类型”解释,但我不禁想知道 PHP-FIG 是否还有其他想法,特别是考虑到 URI 语法的复杂性一般来说。

如果 UriInterface 方法(如 withPath)传递了一个字符串,是否存在任何情况下应该抛出异常?

4

1 回答 1

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: 不是字符串;

最后,特殊处理接收$uri作为(可选 NULL)构造函数参数传递的 URI 字符串():

  • 未设置
  • 不是字符串
  • 是空的

...和 ​​URI 部分数组,作为调用parse_urlURI 字符串参数(此处为 throw UnexpectedValueException)的结果:

$uriParts = parse_url($uri);

if ($uriParts === FALSE) {
    throw new \UnexpectedValueException('URI could not be parsed!');
}

请注意,我已经列出了 UriInterface 实现中的所有异常抛出情况。

于 2017-09-19T01:21:36.620 回答