fanqingxuan / presenter
v0.1.1
2020-08-16 00:56 UTC
Requires
- php: >=5.4
- league/fractal: ~0.19.2
This package is auto-updated.
Last update: 2024-09-16 09:57:16 UTC
README
这个库主要实现结构化输出结果,以避免因后端增加或删除字段而导致返回结果字段被增删。
环境要求
php>=5.4
安装和使用
composer require fanqingxuan/presenter
使用方法
require 'vendor/autoload.php'; use Json\TransformerAbstract; use Json\Presenter; class BookTransformer extends TransformerAbstract { public function transform($book) { return [ 'id' => (int) $book['id'], 'title' => $book['title'], 'year' => (int) $book['yr'], ]; } } $presenter = new Presenter(); //模拟源数据 $books =[ 'id' => '1', 'title' => 'Hogfather', 'yr' => '1998', 'author_name' => 'Philip K Dick', 'author_email' => 'philip@example.org', ]; $data = $presenter->transform($books,new BookTransformer(),false);//不包含引用资源,输出单记录结构
输出结果
Array ( [id] => 1 [title] => Hogfather [year] => 1998 )
功能说明
-
输出单个记录结构
//模拟源数据 $books =[ 'id' => '1', 'title' => 'Hogfather', 'yr' => '1998', 'author_name' => 'Philip K Dick', 'author_email' => 'philip@example.org', ]; $data = $presenter->transform($books,new BookTransformer(),false);//不包含引用资源,输出单记录结构
注意:transform的第三个参数是false,表示数据源是单个记录结构
-
输出单个记录结构,且结构引入其他资源
-
方法一
//定义transformer class LinkTransformer extends TransformerAbstract { public function transform($book) { return [ 'rel' => 'self', 'uri' => '/books/'.$book['id'], ]; } } class BookTransformer extends TransformerAbstract { /** * List of resources possible to include * * @var array */ protected $availableIncludes = [ 'links' ]; public function transform($book) { return [ 'id' => (int) $book['id'], 'title' => $book['title'], 'year' => (int) $book['yr'], ]; } public function includeLinks($book) { return $this->item($book,new LinkTransformer); } } $presenter = new Presenter(); //模拟源数据 $books =[ 'id' => '1', 'title' => 'Hogfather', 'yr' => '1998', 'author_name' => 'Philip K Dick', 'author_email' => 'philip@example.org', ]; $data = $presenter->transform($books,new BookTransformer(['links']),false);//包含引用记录,输出单记录结构 print_r($data);
在Transformer类的构造函数中传递引用的资源,可以是数组或字符串
-
方法二
通过Transformer的setAvailableIncludes()方法设置引用的资源,参考可以是数组或字符串,多个资源用逗号分隔。
//定义transformer class LinkTransformer extends TransformerAbstract { public function transform($book) { return [ 'rel' => 'self', 'uri' => '/books/'.$book['id'], ]; } } class BookTransformer extends TransformerAbstract { /** * List of resources possible to include * * @var array */ protected $availableIncludes = [ 'links' ]; public function transform($book) { return [ 'id' => (int) $book['id'], 'title' => $book['title'], 'year' => (int) $book['yr'], ]; } public function includeLinks($book) { return $this->item($book,new LinkTransformer); } } $presenter = new Presenter(); //模拟源数据 $books =[ 'id' => '1', 'title' => 'Hogfather', 'yr' => '1998', 'author_name' => 'Philip K Dick', 'author_email' => 'philip@example.org', ]; //包含引用记录,输出单记录结构的另一种方式 $bookTransformer = new BookTransformer; $bookTransformer->setAvailableIncludes('links'); $data = $presenter->transform($books,$bookTransformer,false);//包含引用记录,输出单记录结构 print_r($data);
-
-
输出集合资源
require 'vendor/autoload.php'; use Json\TransformerAbstract; use Json\Presenter; class BookTransformer extends TransformerAbstract { public function transform($book) { return [ 'id' => (int) $book['id'], 'title' => $book['title'], 'year' => (int) $book['yr'], ]; } } $presenter = new Presenter(); //原始数据 $userlist = [ [ 'user_id' => '1', 'name' => 'Json', 'email' => 'fanqingxuan@163.com', 'age' => 32, 'list' => [ [ 'id' => 1, 'title' => '文章1', 'text' => '文章1内容', 'status'=> 1 ], [ 'id' => 2, 'title' => '文章2', 'text' => '文章2内容', 'status'=> 0 ] ] ], [ 'user_id' => '2', 'name' => '范先生', 'email' => 'json@163.com', 'age' => 29, 'list' => [ [ 'id' => 3, 'title' => '文章3', 'text' => '文章3内容', 'status'=> 1 ], [ 'id' => 4, 'title' => '文章4', 'text' => '文章4内容', 'status'=> 1 ] ] ] ]; class PostTransformer extends TransformerAbstract { public function transform(array $post) { return [ 'post_id' => $post['id'], 'title' => $post['title'] ]; } } class UserTransformer extends TransformerAbstract { protected $availableIncludes = ['posts']; public function transform(array $userInfo) { return [ 'id' => (int) $userInfo['user_id'], 'username' => $userInfo['name'], 'email' => $userInfo['email'], ]; } public function includePosts($userInfo) { $posts = $userInfo['list']; return $this->collection($posts,new PostTransformer); } } $data = $presenter->transform($userlist,new UserTransformer());//不包含引用资源,输出集合结构 print_r($data);
注意:transform()方法没有传递第三个参数,默认为true,表示处理集合
-
输出集合资源,且引用其他资源结构
与单资源类似,也有两种方法,两种方法的代码如下:
//方式1 $data = $presenter->transform($userlist,new UserTransformer(['posts']));//包含引用记录,输出集合结构 print_r($data); //方式2 //包含引用记录,输出集合结构的另一种方式 $userTransformer = new UserTransformer; $userTransformer->setAvailableIncludes('posts'); $data = $presenter->transform($userlist,$userTransformer);//包含引用记录,输出集合结构 print_r($data);