nilportugues / laravel5-json
Laravel 5 Json API Transformer 包
1.3.0
2016-01-05 14:40 UTC
Requires
Requires (Dev)
- fabpot/php-cs-fixer: ^1.10
- laravel/laravel: 5.*
- phpunit/phpunit: 4.*
README
兼容 Laravel 5.0, 5.1 & 5.2
安装
使用Composer安装此包
$ composer require nilportugues/laravel5-json
Laravel 5 / Lumen 配置
步骤 1: 添加 Service Provider
Laravel
打开config/app.php
,在providers
数组下添加以下行
'providers' => [ //... \NilPortugues\Laravel5\Json\Laravel5JsonServiceProvider::class, ],
Lumen
打开bootstrap/app.php
,在return $app;
语句之前添加以下行
$app->register(\NilPortugues\Laravel5\Json\Laravel5JsonServiceProvider::class); $app->configure('json');
同时,通过取消注释来启用 Facades
$app->withFacades();
步骤 2: 添加映射
在config/
目录下创建一个json.php
文件。此文件应返回一个包含所有类映射的数组。
步骤 3: 使用方法
例如,假设以下对象是从一个存储库中检索到的,例如PostRepository
- 这是在 Eloquent 或您喜欢的其他风味中实现的
use Acme\Domain\Dummy\Post; use Acme\Domain\Dummy\ValueObject\PostId; use Acme\Domain\Dummy\User; use Acme\Domain\Dummy\ValueObject\UserId; use Acme\Domain\Dummy\Comment; use Acme\Domain\Dummy\ValueObject\CommentId; //$postId = 9; //PostRepository::findById($postId); $post = new Post( new PostId(9), 'Hello World', 'Your first post', new User( new UserId(1), 'Post Author' ), [ new Comment( new CommentId(1000), 'Have no fear, sers, your king is safe.', new User(new UserId(2), 'Barristan Selmy'), [ 'created_at' => (new \DateTime('2015/07/18 12:13:00'))->format('c'), 'accepted_at' => (new \DateTime('2015/07/19 00:00:00'))->format('c'), ] ), ] );
和一系列放置在config/json.php
中的映射,这些映射需要使用命名路由,这样我们就可以使用route()
辅助函数
<?php //config/json.php return [ [ 'class' => 'Acme\Domain\Dummy\Post', 'alias' => 'Message', 'aliased_properties' => [ 'author' => 'author', 'title' => 'headline', 'content' => 'body', ], 'hide_properties' => [ ], 'id_properties' => [ 'postId', ], 'urls' => [ 'self' => ['name' => get_post'], //named route 'comments' => ['name' => 'get_post_comments'], //named route ], ], [ 'class' => 'Acme\Domain\Dummy\ValueObject\PostId', 'alias' => '', 'aliased_properties' => [], 'hide_properties' => [], 'id_properties' => [ 'postId', ], 'urls' => [ 'self' => ['name' => 'get_post'], //named route ], ], [ 'class' => 'Acme\Domain\Dummy\User', 'alias' => '', 'aliased_properties' => [], 'hide_properties' => [], 'id_properties' => [ 'userId', ], 'urls' => [ 'self' => ['name' => 'get_user'], //named route 'friends' => ['name' => 'get_user_friends'], //named route 'comments' => ['name' => 'get_user_comments'], //named route ], ], [ 'class' => 'Acme\Domain\Dummy\ValueObject\UserId', 'alias' => '', 'aliased_properties' => [], 'hide_properties' => [], 'id_properties' => [ 'userId', ], 'urls' => [ 'self' => ['name' => 'get_user'], //named route 'friends' => ['name' => 'get_user_friends'], //named route 'comments' => ['name' => 'get_user_comments'], //named route ], ], [ 'class' => 'Acme\Domain\Dummy\Comment', 'alias' => '', 'aliased_properties' => [], 'hide_properties' => [], 'id_properties' => [ 'commentId', ], 'urls' => [ 'self' => ['name' => 'get_comment'], //named route ], ], [ 'class' => 'Acme\Domain\Dummy\ValueObject\CommentId', 'alias' => '', 'aliased_properties' => [], 'hide_properties' => [], 'id_properties' => [ 'commentId', ], 'urls' => [ 'self' => ['name' => 'get_comment'], //named route ], ], ];
命名路由属于app/Http/routes.php
。以下是一个提供的映射路由的示例
Laravel
Route::get( '/post/{postId}', ['as' => 'get_post', 'uses' => 'PostController@getPostAction'] ); Route::get( '/post/{postId}/comments', ['as' => 'get_post_comments', 'uses' => 'CommentsController@getPostCommentsAction'] ); //...
Lumen
$app->get( '/post/{postId}', ['as' => 'get_post', 'uses' => 'PostController@getPostAction'] ); $app->get( '/post/{postId}/comments', ['as' => 'get_post_comments', 'uses' => 'CommentsController@getPostCommentsAction'] ); //...
所有这些设置都允许您轻松使用JsonSerializer
服务,如下所示
<?php namespace App\Http\Controllers; use Acme\Domain\Dummy\PostRepository; use NilPortugues\Laravel5\Json\JsonSerializer; use NilPortugues\Laravel5\Json\JsonResponseTrait; class PostController extends \Laravel\Lumen\Routing\Controller { use JsonResponseTrait; /** * @var PostRepository */ protected $postRepository; /** * @var JsonSerializer */ protected $serializer; /** * @param PostRepository $postRepository * @param JsonSerializer $jsonSerializer */ public function __construct(PostRepository $postRepository, JsonSerializer $jsonSerializer) { $this->postRepository = $postRepository; $this->serializer = $jsonSerializer; } /** * @param int $postId * * @return \Symfony\Component\HttpFoundation\Response */ public function getPostAction($postId) { $post = $this->postRepository->findById($postId); /** @var \NilPortugues\Api\Json\JsonTransformer $transformer */ $transformer = $this->serializer->getTransformer(); $transformer->setSelfUrl(route('get_post', ['postId' => $postId])); $transformer->setNextUrl(route('get_post', ['postId' => $postId+1])); return $this->response($this->serializer->serialize($post)); } }
输出
HTTP/1.1 200 OK
Cache-Control: protected, max-age=0, must-revalidate
Content-type: application/json; charset=utf-8
{ "post_id": 9, "headline": "Hello World", "body": "Your first post", "author": { "user_id": 1, "name": "Post Author" }, "comments": [ { "comment_id": 1000, "dates": { "created_at": "2015-07-18T12:13:00+00:00", "accepted_at": "2015-07-19T00:00:00+00:00" }, "comment": "Have no fear, sers, your king is safe.", "user": { "user_id": 2, "name": "Barristan Selmy" } } ], "links": { "self": { "href": "http://localhost:8000/post/9" }, "next": { "href": "http://localhost:8000/post/10" }, "comments": { "href": "http://localhost:8000/post/9/comments" } } }
响应对象(JsonResponseTrait)
以下JsonResponseTrait
方法提供了返回正确头和HTTP状态码的方法
protected function errorResponse($json); protected function resourceCreatedResponse($json); protected function resourceDeletedResponse($json); protected function resourceNotFoundResponse($json); protected function resourcePatchErrorResponse($json); protected function resourcePostErrorResponse($json); protected function resourceProcessingResponse($json); protected function resourceUpdatedResponse($json); protected function response($json); protected function unsupportedActionResponse($json);
## 质量
要在命令行运行PHPUnit测试,请转到测试目录并运行phpunit。
此库试图遵守PSR-1、PSR-2、PSR-4和PSR-7。
如果您发现遵守上的疏忽,请通过Pull Request发送补丁。
## 贡献
欢迎对包的贡献!
## 支持
您可以通过以下方式之一与我联系
- 通过contact@nilportugues.com给我发邮件
- 通过问题打开问题
- 使用 Gitter:
## 作者
许可证
代码库受MIT许可证的许可。