推出了 HeaderUtils 类
Contributed by
Christian Schmidt
in #24699.
解析 HTTP 头并不像某些人想的那样繁琐。在一些特殊的地方,它需要用斜杠转义和忽略空格来解析引用型字符串。我们在 HttpFoundation组件 的某些方法中这样做了,随之而来的是重复的代码难于维护。
这就是为何在 Symfony 4.1 中我们引入了全新的 HeaderUtils
类,提供了解析 HTTP headers 时所需的最常用工具。这并非内部类,所以你可以在自己的代码中使用它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | use Symfony\Component\HttpFoundation\HeaderUtils;
// Splits an HTTP header by one or more separators
// 把 HTTP 头用一或多个分隔符切开
HeaderUtils::split('da, en-gb;q=0.8', ',;')
// => array(array('da'), array('en-gb'), array('q', '0.8'))
// Combines an array of arrays into one associative array
// 把数组的数组合并成一个键值数组
HeaderUtils::combine(array(array('foo', 'abc'), array('bar')))
// => array('foo' => 'abc', 'bar' => true)
// Joins an associative array into a string for use in an HTTP header
// 把键值数组合并成一个在 HTTP头 中使用的字符串
HeaderUtils::toString(array('foo' => 'abc', 'bar' => true, 'baz' => 'a b c'), ',')
// => 'foo=abc, bar, baz="a b c"'
// Encodes a string as a quoted string, if necessary
// 在需要时,把字符串转换成引用字符串
HeaderUtils::quote('foo "bar"')
// => 'foo \"bar\"'
// Decodes a quoted string
// 反解一个引用型字符串
HeaderUtils::unquote('foo \"bar\"')
// => 'foo "bar"' |
当测试表单提交时允许无视头信息
有个问题 被 Mink 浏览器的测试项目报告出来,令我们意识到,你不可以在使用了 BrowserKit 组件 的测试系统中提交表单时,忽略 HTTP 头。
这就是为何在 Symfony 4.1 中submit()
方法现在接受第三个可选参数,其名为 $serverParameters
,使你可以像下面这样做事:
1 2 3 4 | $crawler = $client->request('GET', 'http://www.example.com/foo');
$form = $crawler->filter('input')->form();
$client->submit($form, [], ['HTTP_ACCEPT_LANGUAGE' => 'de']);
// => $client->getRequest()->getServer()['HTTP_ACCEPT_LANGUAGE'] = 'de' |
对Accept headers添加了默认值的支持
Contributed by
Javier Eguiluz
in #26036.
当使用了 Accept
HTTP header 时,使用 .../*
和 */*
甚至 *
这种表达式来定义默认值很常见。:
1 | Accept: text/plain;q=0.5, text/html, text/*;q=0.8, */* |
然而,在 Symfony 4.1 之前的版本中,这些默认值不被支持:
1 2 3 4 5 6 7 | use Symfony\Component\HttpFoundation\AcceptHeader;
$acceptHeader = AcceptHeader::fromString('text/plain;q=0.5, text/html, text/*;q=0.8, */*');
$quality = $acceptHeader->get('text/xml')->getQuality();
// instead of returning '0.8', this code displays the following error message:
// 不返回 '0.8',以上代码显示如下错误信息:
// Call to a member function getQuality() on null |
在 Symfony 4.1 中所有默认值都被正确地支持了:
1 2 3 4 | $acceptHeader = AcceptHeader::fromString('text/plain;q=0.5, text/html, text/*;q=0.8, */*');
$acceptHeader->get('text/xml')->getQuality(); // => 0.8 (because of text/*)
$acceptHeader->get('text/html')->getQuality(); // => 1.0
$acceptHeader->get('application/xml')->getQuality(); // => 1.0 (because of */*) |