我在下面写了这个简单的过滤器:
Route::filter('token', function()
{
$headers = json_decode(json_encode(getallheaders()), true);
if(array_key_exists($headers['Authorization'], $headers)) {
echo 'test';
}
});
它使用getallheaders()
函数而不是Laravel的Request
类,因为Request
类还不能识别自定义HTTP头。
打印此数组时,返回:
Array
(
[Host] => api.myapi.com
[Connection] => keep-alive
[Accept] => application/json, text/plain, */*
[Origin] => http://myorigin
[User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36
[Authorization] => eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9hcGkuYmFjazlpbnMuY29tIiwiYXVkIjoiaHR0cDpcL1wvMTYyLjI0My4xMDEuMjAyXC9zbWFydDIiLCJpYXQiOjE0MTQ2ODE1NzgsIm5iZiI6MTQxNDY4MzM3OCwidXNlciI6ImI4YTAwNzIxLTQwZjEtNzgwMS1iNGI5LTUwY2UxNTJjZTJlYyJ9.VrcWRwupzuS_Y5PNiNfXCAMl3bVbifFIHptMO6
[Referer] => http://myorigin/myproject/
[Accept-Encoding] => gzip,deflate,sdch
[Accept-Language] => en-US,en;q=0.8
)
然而,array_key_exists($headers['Authorization'], $headers)
不断地评估为false。在这种情况下,为什么它会被评估为错误?我在标头中发送Authorization令牌,当我print_r()
数组时,它会清楚地识别标头,并根据请求提供正确的值。
这可能有什么问题?
您的原始示例失败了,因为您使用了array_key_exists($headers['Authorization'], $headers)
,而本应使用array_key_exists('Authorization', $headers)
。
但更重要的是,这并不是解决问题的最佳方案。测试相当困难,而且很容易为您提供更好的方法来解决这个问题,主要是提供的Request对象。
Route::filter('token', function ($route, 'Illuminate'Http'Request $request) {
if ($request->headers('Authorization')) {
echo "Token is " . {$request->headers('Authorization')};
}
});
这很容易提供测试过滤器是否按预期工作的能力。代码也更易于阅读。
所以我解决了自己的问题。不同的方式,但我实现了我想要的(检查以确保Authorization
标头已发送)。
我在array_keys($headers)
上运行了一个print_r()
,它返回了一个包含所有头的数组。
然后我写道:
echo in_array('Authorization', array_keys($headers));
它返回true
,因为它是真的。
如果有人对array_key_exists()
不起作用的原因有更好的解决方案或答案,我很想听听原因。