推出了 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"'

当测试表单提交时允许无视头信息

Contributed by
cfjulien
in #26791.

有个问题 被 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 */*)