realshadow / request-deserializer
为基于 Dingo API 构建的 API 提供 JSON 模式验证和请求反序列化的包
Requires
- php: ^5.6.0 || ^7.0
- dingo/api: v1.0.0-beta8
- doctrine/cache: ^1.6
- jms/serializer: ^1.7
- justinrainbow/json-schema: ^5.0
- mews/purifier: ^2.0
Requires (Dev)
- mikey179/vfsstream: 1.0.*
- mockery/mockery: ^0.9.9
- orchestra/testbench: ~3.0
- phpunit/phpunit: ^4.8 || ^5.0
README
请求反序列化
为基于 Dingo API 的 API 提供 JSON 模式验证和请求反序列化的包。
安装
由于此包基于 Dingo API 构建,因此必须首先安装它,有关详细信息,请参阅其安装说明。
现在您可以运行
composer require realshadow/request-deserializer
将包提供程序添加到 app.php 配置文件中的提供程序列表中
\Realshadow\RequestDeserializer\Providers\LaravelServiceProvider::class
并将请求反序列化中间件添加到 Kernel
Realshadow\RequestDeserializer\Http\Middleware\RequestDeserializationMiddleware::class
最后一步,使用以下命令发布配置文件
php artisan vendor:publish --provider="Realshadow\RequestDeserializer\Providers\LaravelServiceProvider
请注意,此包依赖于 Purifier 包,如果您正在使用它,则必须相应地更新其配置或使用 --force 选项进行发布。
用法
完成安装步骤后,您可以将 DeserializesRequests 特性添加到控制器中。现在您可以创建一个新的模式和请求对象对(有关更多详细信息,请参阅工作原理部分)。
工作原理
此包基于 Dingo API 构建,并结合了两个优秀的包 - JMS serializer 和 JSON schema validator,为所有传入请求创建一个强大的验证和反序列化层。
注意:我将假设您至少熟悉所需的包之一。
现在让我们看看实际的操作
中间件将捕获每个请求并检查控制器中调用的方法是否在其参数中期望任何请求对象。如果找到,则请求将运行通过 3 个步骤
- 数据将被清理(通过 HTML Purifier 清理,并使用 htmlspecialchars 方法将所有特殊字符转换)
- 与提供的 JSON 模式进行验证
- 验证后的数据将被反序列化为请求对象
基本请求对象看起来像这样
class PaginatedRequest implements RequestInterface
{
/**
* @var int $page
*
* @JMS\Since("1.x")
* @JMS\Type("integer")
* @JMS\SerializedName("page")
*/
private $page;
// If the request should be validated against schema or not
public static function shouldValidate()
{
return true;
}
// Request version - this allows to use the same request for multiple API versions
public static function getVersionConstraint()
{
return '1.0';
}
// Most important method - returns path to JSON schema this request should validate against
public function getSchema()
{
return resource_path('schemas/foo.json');
}
/**
* @return int
*/
public function getPage()
{
return $this->page;
}
}
请求对象 必须 实现 RequestInterface。此接口包含三个辅助方法,将为我们描述请求(请参阅上面的代码中的 phpdoc)以及属性列表及其相应的 getter 方法。
当请求验证失败时,它将抛出 HTTP 422 验证异常,并列出违反的约束。
GET 请求
PHP 将将查询字符串中的每个参数处理为 字符串。在这种情况下,验证过程将使用 类型强制。此外,所有传递的数据都将反序列化为请求对象中定义的正确类型。
注意事项
由于所有属性始终都存在于请求对象中(或任何对象),因此无法区分应该具有 null 值 的属性和请求体中不存在的属性,因为它们始终为 null。您可以通过使用 Laravel 的 Input 门面或任何其他直接与原始请求一起工作的可行方法来解决这个问题。
配置
包包含两个配置文件
- 修改后的 HTML purifier 配置文件
- 包配置文件
包配置
包配置将被合并,因此如果您想扩展它,只需从包配置中复制所需选项即可。
序列化程序缓存目录可以通过在.env文件中设置SERIALIZER_STORAGE_PATH键来配置。
辅助命令
由于创建较大的请求对象可能会变得繁琐,这个包包含一个辅助命令,可以从提供的JSON模式生成新的请求对象。使用非常简单
php artisan schema:convert {path to schema} {reqeust object}
// e.g.
php artisan schema:convert pagination.json PaginationRequest.php
JSON模式和创建的请求总是相对于配置中设置的目录,包括请求对象所属的命名空间。
示例
在示例文件夹中,您可以找到两个包含请求对象及其相应模式的目录 - 一个简单的请求和一个更复杂的具有嵌套模式的请求。这些应该直接使用,所以只需将它们复制到相应的文件夹中即可(别忘了在路由中添加方法!)
此外,您还可以导入一个Postman集合,其中包含两个示例请求,这些请求与示例模式一起使用。