everycheck / api-rest-utils
此包已被废弃,不再维护。未建议替代包。
1.6
2019-12-18 09:50 UTC
Requires
- symfony/symfony: 3.4.*
Requires (Dev)
- php: >=5.5.9
- doctrine/doctrine-bundle: ^1.6
- doctrine/orm: ^2.5
- jms/serializer-bundle: ^1.0 | ^2.0
- sensio/distribution-bundle: ^5.0.19
- sensio/framework-extra-bundle: ^5.0.0
- symfony/monolog-bundle: ^3.1.0
- symfony/polyfill-apcu: ^1.0
README
一些基本工具,我们用于在 symfony 下的每个 api rest 项目中
响应构建器
目前有一个类负责构建 api rest 需要的不同类型的响应。
所有方法返回一个 Symfony\Component\HttpFoundation\Response
,内容为 json。
使用
public function getAction($id) { $response = new ResponseBuilder($this->get('jms_serializer')); $entity = $this->getDoctrine()->getManager()->getRepository(Entity::class)->find($id); if(empty($entity)) return $response->notFound(); return $response->ok($entities); }
可用的响应
- json
- 空
- 未找到
- 成功
- 已创建
- 已删除
- 冲突
- 禁止路由
- 禁止 ACL
- 禁止
- 错误请求
- 表单错误 用于解析 symfony 表单错误
- 未授权
配置头部
使用 addHeaders
方法
public function getAction($id) { $response = new ResponseBuilder($this->get('jms_serializer')); $entity = $this->getDoctrine()->getManager()->getRepository(Entity::class)->find($id); if(empty($entity)) return $response->notFound(); return $response->addHeaders('X-something','some-value')->ok($entities); }
按筛选和排序查找分页
另一项常见需求是查找匹配特定筛选条件并按某些标准排序的所有实体
只需在您的存储库中添加此特质,如下所示
<?php namespace ACMEBundle\Repository; use EveryCheck\ApiRest\Utils\PaginatedRepositoryTrait; class PostRepository extends \Doctrine\ORM\EntityRepository { use PaginatedRepositoryTrait; const BASE_QUERY_NAME = 'post'; const LEFT_JOIN_ALIAS_LIST = [ 'post.author' => 'author', 'post.responses' => 'response', ]; const FILTER_OPTION = [ ['filterOn'=>'author.username' , 'filterName' => 'username' , 'filterKind'=>'like' ], ['filterOn'=>'response.message' , 'filterName' => 'response_message' , 'filterKind'=>'like' ], ['filterOn'=>'response.date' , 'filterName' => 'date' , 'filterKind'=>'greaterThan' ], ]; }
以下是一个示例,其中您在左连接上启用了3个字段的搜索。您也可以按这些字段排序。
控制器端
/** * @Route("/posts", name="get_post_list", methods={"GET"}) */ public function getPostListAction(Request $request) { $posts = $this->getEntityManager()->getRepository(Post::class)->findPaginatedFromRequest($request); return $this->getResponseBuilder()->ok($posts); }
响应示例
{ "limit": 10, "offset": 0, "count": 1, "entities": [ { "message":"something", "author":{ "username":"someone" }, "responses":[ { "message":"something else", "author":{ "username":"someone_else" } } ] } ] }
简单吗?