HTTP Request
Testing Is Documentation
QueryPHP 请求对象构建在 Symfony HttpFoundation 之上,增加了少量的功能。
使用方式
使用容器 request 服务
php
\App::make('request')->get($key, $default = null);
\App::make('request')->all(): array;
依赖注入
php
class Demo
{
private \Leevel\Http\Request $request;
public function __construct(\Leevel\Http\Request $request)
{
$this->request = $request;
}
}
使用静态代理
php
\Leevel\Router\Proxy\Request::get(string $key, $default = null);
\Leevel\Router\Proxy\Request::all(): array;
注意
为了一致性或者更好与 RoadRunner 对接,请统一使用请求对象处理输入,避免直接使用 $_GET
、$_POST
,$_COOKIE
,$_FILES
,$_SERVER
等全局变量。
Uses
php
<?php
use Leevel\Http\Request;
use Leevel\Kernel\Utils\Api;
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
createFromSymfonyRequest 从 Symfony 请求创建 Leevel 请求
php
public function testCreateFromSymfonyRequest(): void
{
$symfonyRequest = new SymfonyRequest(['foo' => 'bar', 'hello' => 'world'], [], [], [], [], [], 'content');
$request = Request::createFromSymfonyRequest($symfonyRequest);
$this->assertInstanceof(Request::class, $request);
self::assertSame(['foo' => 'bar', 'hello' => 'world'], $request->query->all());
self::assertSame('content', $request->getContent());
}
all 获取所有请求参数
- 包含 request、query 和 attributes
- 优先级从高到底依次为 attributes、query 和 request,优先级高的会覆盖优先级低的参数
php
public function testAll(): void
{
$request = new Request(['query' => '1'], ['request' => '2'], ['attributes' => '3']);
self::assertSame(['request' => '2', 'query' => '1', 'attributes' => '3'], $request->all());
$request = new Request(['foo' => '1'], ['foo' => '2'], ['foo' => '3']);
self::assertSame(['foo' => '2'], $request->all());
}
exists 请求是否包含非空
php
public function testExists(): void
{
$request = new Request(['foo' => 'bar', 'hello' => 'world']);
self::assertTrue($request->exists(['foo']));
self::assertTrue($request->exists(['foo', 'hello']));
self::assertFalse($request->exists(['notFound']));
}
only 取得给定的 keys 数据
php
public function testOnly(): void
{
$request = new Request(['foo' => 'bar', 'hello' => 'world']);
self::assertSame(['foo' => 'bar'], $request->only(['foo']));
self::assertSame(['foo' => 'bar', 'hello' => 'world'], $request->only(['foo', 'hello']));
self::assertSame(['foo' => 'bar', 'not' => null], $request->only(['foo', 'not']));
}
except 取得排除给定的 keys 数据
php
public function testExcept(): void
{
$request = new Request(['foo' => 'bar', 'hello' => 'world']);
self::assertSame(['hello' => 'world'], $request->except(['foo']));
self::assertSame([], $request->except(['foo', 'hello']));
self::assertSame(['hello' => 'world'], $request->except(['foo', 'not']));
}
isConsole 是否为 PHP 运行模式命令行
php
public function testIsConsole(): void
{
$request = new Request();
self::assertTrue($request->isConsole());
}
isCgi 是否为 PHP 运行模式 cgi
php
public function testIsCgi(): void
{
$request = new Request();
self::assertFalse($request->isCgi());
}
isPjax 是否为 Pjax 请求行为
php
public function testIsPjax(): void
{
$request = new Request();
self::assertFalse($request->isPjax());
$request->request->set(Request::VAR_PJAX, true);
self::assertTrue($request->isPjax());
}
isAcceptAny 是否为接受任何请求,支持伪装
php
public function testIsAcceptJson(): void
{
$request = new Request();
self::assertFalse($request->isRealAcceptJson());
self::assertFalse($request->isAcceptJson());
$request->headers->set('accept', 'application/json, text/plain, */*');
self::assertTrue($request->isRealAcceptJson());
self::assertTrue($request->isAcceptJson());
$request->headers->remove('accept');
self::assertFalse($request->isRealAcceptJson());
self::assertFalse($request->isAcceptJson());
// (isAjax && !isPjax) && isAcceptAny
$request->request->set(Request::VAR_AJAX, 1);
self::assertFalse($request->isRealAcceptJson());
self::assertTrue($request->isAcceptJson());
$request->request->remove(Request::VAR_AJAX);
// 伪装
$request->query->set(Request::VAR_ACCEPT_JSON, '1');
self::assertTrue($request->isAcceptJson());
self::assertFalse($request->isRealAcceptJson());
}
isAcceptAny 是否为接受任何请求
php
public function testIsAcceptAny(): void
{
$request = new Request();
self::assertTrue($request->isAcceptAny());
$request->headers->set('accept', 'application/json');
self::assertFalse($request->isAcceptAny());
$request->headers->set('accept', '*/*');
self::assertTrue($request->isAcceptAny());
}
getEnter 获取入口文件
php
public function testGetEnter(): void
{
$request = new Request();
self::assertSame('', $request->getEnter());
}
setPathInfo 设置 pathInfo
php
public function testSetPathInfo(): void
{
$request = new Request();
self::assertSame('/', $request->getPathInfo());
$request->setPathInfo('/foo/bar');
self::assertSame('/foo/bar', $request->getPathInfo());
}
toArray 对象转数组
Request 请求对象实现了 \Leevel\Support\IArray
接口。
php
public function testToArray(): void
{
$request = new Request(['foo' => 'bar', 'hello' => 'world']);
self::assertSame(['foo' => 'bar', 'hello' => 'world'], $request->toArray());
}