pz / doctrine-rest
Doctrine 2 ORM 的 Rest API 库
0.4.0
2024-02-29 13:58 UTC
Requires
- php: ^8.1
- ext-json: *
- doctrine/annotations: ^2.0
- doctrine/orm: ^2.14
- league/fractal: ^0.20
- pmill/doctrine-array-hydrator: ^0.1.2
- symfony/cache: ^6.0
- symfony/http-foundation: ^6.0
- symfony/validator: ^5.0
Requires (Dev)
- dms/phpunit-arraysubset-asserts: ^0.4.0
- doctrine/migrations: ^3.4
- mockery/mockery: ^1.0
- phpunit/phpunit: ^9
README
框架无关,库提供基本工具以在 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