maclonghorn / json-api-for-lumen
Lumen助手,帮助轻松实现json-api标准
此包的官方仓库似乎已消失,因此该包已被冻结。
v1.5.0
2020-07-01 17:49 UTC
Requires
- php: ^7.2.5
- illuminate/http: ^7.0
- illuminate/support: ^7.0
- neomerx/json-api: 1.*
Requires (Dev)
- mockery/mockery: 1.0.0-alpha1
- phpunit/phpunit: ^6.0
- scrutinizer/ocular: ~1.1
- squizlabs/php_codesniffer: ~2.8
README
Lumen助手,帮助轻松实现json-api标准
安装
通过Composer
$ composer require realpage/json-api-for-lumen
Lumen
您可以在 bootstrap/app.php 中注册服务提供者
$app->register(RealPage\JsonApi\Lumen\ServiceProvider::class);
使用方法
中间件
强制执行媒体类型
满足json-api文档中“服务器责任”部分的请求。这应该包装所有符合json-api规范的路由。
您可以在 bootstrap/app.php 中注册中间件
$app->routeMiddleware([ 'json-api.enforce-media-type' => RealPage\JsonApi\Middleware\EnforceMediaType::class, ]);
然后您可以在 routes.php 文件中使用该中间件
$app->get('quotes', ['middleware' => 'json-api.enforce-media-type', function () { // }]);
验证
使用Laravel的验证功能来验证您的请求,并且此包将处理将失败的验证转换为有效的json-api响应。
将此条目添加到您的异常处理程序中
use Illuminate\Http\Response; use Neomerx\JsonApi\Encoder\Encoder; use Neomerx\JsonApi\Exceptions\JsonApiException; use Neomerx\JsonApi\Contracts\Http\Headers\MediaTypeInterface; // automatically encode exceptions as valid json-api json responses if ($e instanceof JsonApiException) { return new Response(Encoder::instance()->encodeErrors($e->getErrors()), $e->getHttpCode(), [ 'Content-Type' => MediaTypeInterface::JSON_API_MEDIA_TYPE, ]); }
只需要扩展几个类
use RealPage\JsonApi\Validation\ValidatesRequests; class MyValidator extends ValidatesRequests { public function rules() : array { return array_merge(parent::rules(), [ 'data.attributes.name' => 'required', ]); } public function messages() : array { return array_merge(parent::messages(), [ 'data.attributes.name.required' => 'A name is required', ]); } }
use RealPage\JsonApi\Requests\Request; use RealPage\JsonApi\Validation\ValidatesRequests; class MyRequest extends Request { public function validator() : ValidatesRequests { return new MyValidator(); } }
在控制器中,您只需在请求上调用validate即可
public function store(MyRequest $request) { $request->validate(); // do stuff }
编码器
配置 Neomerx\JsonApi\Encoder\Encoder 实例以编码您的JSONAPI响应。
您可以在 config/json-api.php 中这样配置默认编码器
<?php return [ 'media-type' => 'application/vnd.api+json', 'schemas' => [ App\Models\MyModel::class => App\Schemas\MySchema::class, ], 'jsonapi' => true, 'encoder-options' => [ 'options' => JSON_PRETTY_PRINT, ], 'meta' => [ 'apiVersion' => '1.1', ], ];
然后您可以在控制器类中检索编码器
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use RealPage\JsonApi\EncoderService; use App\Model\MyModel; class MyController extends ApiController { protected $status; protected $encoder; public function __construct(EncoderService $encoder) { $this->encoder = $encoder->getEncoder(); } public function index(Request $request) { $data = [ new MyModel(1, 'Some', "Attribute") ]; return response($this->encoder->encodeData($data)); } }
还可以配置额外的命名编码器,如下所示
<?php return [ 'media-type' => 'application/vnd.api+json', 'schemas' => [ App\Models\MyModel::class => App\Schemas\MySchema::class, ], 'jsonapi' => true, 'encoder-options' => [ 'options' => JSON_PRETTY_PRINT, ], 'meta' => [ 'apiVersion' => '1.1', ], 'encoders' => [ 'custom' => [ 'jsonapi' => true, 'encoder-options' => [ 'options' => JSON_PRETTY_PRINT, ], 'meta' => [ 'apiVersion' => '2.0', ], ] ] ];
然后您可以像这样检索
$this->encoder = $encoder->getEncoder('custom');
变更日志
请参阅 CHANGELOG 获取更多信息。
测试
$ composer test
贡献
请参阅 CONTRIBUTING 获取详细信息。
许可证
MIT许可证(MIT)。请参阅 许可证文件 获取更多信息。