dmf-software/aura-web-psr

PSR-7包装器,用于Aura.Web实现

v1.0.0 2021-02-18 08:57 UTC

This package is auto-updated.

Last update: 2024-08-29 05:41:56 UTC


README

Latest Stable Version Build Status Scrutinizer Code Quality Code Coverage License

简介

Aura.Web实现不遵循PSR-7,这是HTTP消息的建议。随着越来越多的解决常见HTTP消息问题的包实现这一建议,如果这些可以用于Aura.Web实现那就更好了。这个包允许您在不更改底层库的情况下开始实现PSR-7,以保持当前的代码使用1,从而简化迁移或重构

安装

尽管Aura.Web仍然支持到PHP 5.3,但此包需要PHP 7.0或更高版本。旧版本需要迁移到PHP 7才能使用此包。我建议使用rector/rector使升级任务更加简单。

使用composer

composer require dmt-software/aura-web-psr

用法

创建ServerRequest

use DMT\Aura\Psr\Message\ServerRequest;
 
// creating a request from $_SERVER variable
$serverRequest = new ServerRequest(
    $_SERVER['REQUEST_METHOD'] ?? 'GET',
    $_SERVER['REQUEST_URI'] ?? '/',
    $_SERVER
);

处理上传的文件

use DMT\Aura\Psr\Factory\UploadedFileFactory;
use DMT\Aura\Psr\Message\ServerRequest;
use DMT\Aura\Psr\Message\UploadedFile;
 
/** @var ServerRequest $serverRequest */
$serverRequest = $serverRequest->withUploadedFiles(
    /** @var UploadedFileFactory $uploadedFileFactory */
    $uploadedFileFactory->createUploadedFilesFromGlobalFiles($_FILES)
);
 
// at some later point 
foreach ($serverRequest->getUploadedFiles() as $uploadedFile) {
    /** @var UploadedFile $uploadedFile */
    if ($uploadedFile->getError() === \UPLOAD_ERR_OK) {
        // ... process the uploaded file
    }
}

创建Response

use DMT\Aura\Psr\Message\Response;
 
$response = new Response(200, 'Ok');
$response->getBody()->write(/** your response html */);

迁移期间的用法

包装对象

所有PSR-7 http消息包装一个Aura.Web对象。根据其职责,这可以是任何请求或响应对象。这些对象可以通过在http-message上调用getInnerObject()方法来检索。

use DMT\Aura\Psr\Message\ServerRequest;
 
$serverRequest = new ServerRequest(
    $_SERVER['REQUEST_METHOD'] ?? 'GET',
    $_SERVER['REQUEST_URI'] ?? '/',
    $_SERVER
); 
 
$request = $serverRequest->getInnerObject();

// somewhere within the "legacy" code
if ($request->isPost()) {
    // process post data 
}

不可变性

对http消息的更改将由包装对象内部跟踪,但以保留消息不可变性的方式。这意味着对消息对象所做的每次更改都将返回一个新的Aura.Web对象实例。

use DMT\Aura\Psr\Message\ServerRequest;
 
/** @var ServerRequest $serverRequest */ 
$auraRequest = $serverRequest->getInnerObject();
 
// new server request is returned with a fresh Aura.Web request 
$serverRequest = $serverRequest->withProtocolVersion('2');
$newAuraRequest = $serverRequest->getInnerObject();

if ($auraRequest->server->get('SERVER_PROTOCOL') != $newAuraRequest->server->get('SERVER_PROTOCOL')) {
    print 'Protocol version has changed';
}

确保每次更改http-message时,都必须从新的消息实例中检索aura请求。

不兼容性

当使用此包时,某些内置解决方案,如上传文件、接收JSON post等,将不可用。有关如何处理这些差异的概述,请参阅兼容性文档。

http消息使用(部分)Aura.Web对象并不意味着反过来也是真的。一些aura对象不由http消息管理。为了管理这些对象,可以回退到原始代码(一旦检索到内部对象)或使用/编写一些类似的工作代码。有关此方面的技巧和技巧,请参阅解决方案文档。

1:尽我所能