pz/doctrine-rest

Doctrine 2 ORM 的 Rest API 库

0.4.0 2024-02-29 13:58 UTC

README

Build Status Scrutinizer Code Quality Scrutinizer Code Coverage

框架无关,库提供基本工具以在 Doctrine 库上实现 JSON API

默认使用 symfony/http-foundation 处理请求/响应,以及 league/fractal 构建 Rest 响应。

安装

将 composer 包添加到您的项目中

composer require pz/doctrine-rest

用法

包提供不同操作用于数据操作和格式化。

为实体创建实体和 fractal 转换器

// Entity class to work with
$entityClass = 'User';
$entityTransformer = new EntityTransformer();

如果想要使用 JSON API,请在您的 doctrine 实体上实现 JsonApiResource 并在请求中添加以下头部

Accept: application/vnd.api+json

将实体仓库更改为 RestRepository 或创建一个新的。

// Provide configured entity manager
$entityManager = getEntityManager()

// Repository that action will work with
$restRepository = new RestRepository($entityManager, $entityManager->getClassMetadata($entityClass));

准备 RestRequest 实体或在您的自定义 RestRequest 实现上实现 RestRequestContract

// Get http request from framework or init yourself
$httpRequest = Symfony\Component\HttpFoundation\Request::createFromGlobals();
$restRequest = new RestRequest($httpRequest);

集合(索引)操作

路由请求 GET https:///api/{resourceKey}

$action = new CollectionAction($restRepository, $entityTransformer);

/** @var RestResponse|Symfony\Component\HttpFoundation\Response */
$response = $action->dispatch($restRequest);

常规响应

{
    'data': [
        { ...transformer data },
        { ...transformer data },
        { ...transformer data },
    ],
    'meta': [
        'pagination': { ... paginator data },
    ]
}

JSON API 响应

{
    'data': [
        {
            'id': {entityId},
            'type': {etntityResourceKey},
            'attributes': { ...transformer data },
            'relationships': { ..transformer includes },
            'links': {
                'self': 'https:///api/resourceKey/{entityId}
            }
        },
        ... Other entities
    ],
    'meta': [
        'pagination': { ... paginator data },
    ]
}

项目(获取)操作

路由请求 GET https:///api/{resourceKey}/{id}

$action = new ItemAction($restRepository, $entityTransformer);

/** @var RestResponse|Symfony\Component\HttpFoundation\Response */
$response = $action->dispatch($restRequest);

常规响应

{
    'data': [
        'id': {id},
         { ...transformer data }
    ],
}

JSON API 响应

{
    'data': {
        'id': {entityId},
        'type': {etntityResourceKey},
        'attributes': { ...transformer data },
        'relationships': { ..transformer includes },
        'links': {
            'self': 'https:///api/resourceKey/{entityId}
        }
    },
}

创建操作

路由请求 POST https:///api/{resourceKey}

$action = new CreateAction($restRepository, $entityTransformer);

/** @var RestResponse|Symfony\Component\HttpFoundation\Response */
$response = $action->dispatch($restRequest);

常规响应

{
    'data': [
        'id': {id},
         { ...transformer data }
    ],
}

JSON API 响应

{
    'data': {
        'id': {entityId},
        'type': {etntityResourceKey},
        'attributes': { ...transformer data },
        'relationships': { ..transformer includes },
        'links': {
            'self': 'https:///api/resourceKey/{entityId}
        }
    },
}

更新操作

路由请求 PATCH https:///api/{resourceKey}/{id}

$action = new UpdateAction($restRepository, $entityTransformer);

/** @var RestResponse|Symfony\Component\HttpFoundation\Response */
$response = $action->dispatch($restRequest);

常规响应

{
    'data': [
        'id': {id},
         { ...transformer data }
    ],
}

JSON API 响应

{
    'data': {
        'id': {entityId},
        'type': {etntityResourceKey},
        'attributes': { ...transformer data },
        'relationships': { ..transformer includes },
        'links': {
            'self': 'https:///api/resourceKey/{entityId}
        }
    },
}

删除操作

路由请求 DELETE https:///api/{resourceKey}/{id}

$action = new DeleteAction($restRepository, $entityTransformer);

/** @var RestResponse|Symfony\Component\HttpFoundation\Response */
$response = $action->dispatch($restRequest);

响应

HTTP STATUS 204 NO CONTENT

开发

生成 doctrine 迁移差异

我们使用 doctrine 迁移来处理单元测试的数据库模式。

php ./vendor/bin/doctrine-migrations migrations:diff

运行测试

docker compose run php phpunit