everycheck/api-rest-utils

此包已被废弃,不再维护。未建议替代包。

1.6 2019-12-18 09:50 UTC

This package is auto-updated.

Last update: 2022-10-18 16:36:12 UTC


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"
                    }
                }
            ]
        }
    ]
}

简单吗?