差一点两周之前,PHP社区大致接受了PSR-7,给了PHP一个 HTTP Message Interface 的常规集合。这在贯穿PHP全部内容的互用性和标准化方面具有非常大的潜力。对于中间件(middleware)来说具有决定意义:函数已可介入request-response进程,如果一个中间件围绕着这些新接口来写就,它可以用在任何一个框架中。
引入PSR HTTP Message Bridge
现如今,数量 众多 的项目使用了Symfony的 Request 和 Response 类(通过 HttpFoundation 组件),包括Laravel,Drupal 8和StackPHP。这在过去四年中给了我们一个HTTP Messages标准化的基础,在PHP社区准备讨论出一种官方接口之前。提升交互性,正是Symfony哲学的核心。
正因如此,我们战栗地宣布0.1版 PSR HTTP Message Bridge:这个类库可以双向转换Symfony的 Request 和 Response 对象到PSR-7兼容对象。这意味着一旦为PSR-7写一个中间件,则使用HttpFoundation的程序都将兼容它。
从PSR-7对象转换到HttpFoundation就像下面这样容易:
1
2
3
4
5
6
7
8
9
10
11
12
13use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory;
$httpFoundationFactory = new HttpFoundationFactory();
// convert a Request 转换一个Request
// $psrRequest is an instance of Psr\Http\Message\ServerRequestInterface
// $psrRequest是一个Psr\Http\Message\ServerRequestInterface实例
$symfonyRequest = $httpFoundationFactory->createRequest($psrRequest);
// convert a Response 转换一个Response
// $psrResponse is an instance of Psr\Http\Message\ResponseInterface
// $psrResponse是一个Psr\Http\Message\ResponseInterface实例
$symfonyResponse = $httpFoundationFactory->createResponse($psrResponse);
你也可以将一个HttpFoundation对象转换到PSR-7。为了实现这个,桥接使用了Diactoros——这是一个早期的PSR-7 implemetation:
1
2
3
4
5
6
7
8
9
10
11
12
13use Symfony\Bridge\PsrHttpMessage\Factory\DiactorosFactory;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
$psr7Factory = new DiactorosFactory();
// convert a Request 转换一个请求
$symfonyRequest = Request::createFromGlobals();
$psrRequest = $psr7Factory->createRequest($symfonyRequest);
// convert a Response 转换一个响应
$symfonyResponse = new Response('Content');
$psrResponse = $psr7Factory->createResponse($symfonyResponse);
这可以让项目立即享用PSR-7,但却毋需破坏向下兼容性。这实在很重要:Symfony引以为傲的 向下兼容承诺 将不被破坏。
十分感谢douglas(Symfony框架核心开发成员),他做了很多针对这个类库的初始工作。文档编写也已经在 进行中,桥接目前也面临着一些关于大规模请求和响应体的极端状况。但这仅仅是个开始,我们正满怀期待。
Symfony框架中的RequestInterface和ResponseInterface
在Symfony框架中,控制器通常接收Symfony的 Request 对象并返回一个Symfony的 Response 对象。现在,你可以选择接收PSR-7的请求和响应对象来替代,多亏了 SensioFrameworkExtraBundle 的小补丁:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18namespace AppBundle\Controller;
use Psr\Http\Message\ServerRequestInterface;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Zend\Diactoros\Response;
class DefaultController extends Controller
{
public function indexAction(ServerRequestInterface $request)
{
// Interact with the PSR-7 request 操作PSR-7请求
$response = new Response();
// Interact with the PSR-7 response 操作PSR-7响应
return $response;
}
}
在最新版的SensioFrameworkExtraBundle中已经可以利用,并且兼容自Symfony 2.3以来每一个维护中的版本。如果这种情形是你要在控制器中做的,你可以马上开始!