russbalabanov / tiny-rest
Rest
Requires
- php: ^7.2
- doctrine/common: ^2.9
- doctrine/dbal: ^2.8
- doctrine/orm: ^2.6
- pagerfanta/pagerfanta: ^2.0
- symfony/http-foundation: ^4.0|^5.0
- symfony/property-access: ^4.0|^5.0
- symfony/validator: ^4.0|^5.0
Requires (Dev)
- doctrine/data-fixtures: ^1.3
- phpunit/phpunit: ^8
- symfony/framework-bundle: ^4.0|^5.0
- symfony/phpunit-bridge: *
This package is auto-updated.
Last update: 2024-09-27 15:56:15 UTC
README
嘿!我刚刚发布了这个库,目前正在为其编写文档,所以请稍等片刻。
但如果您很急切,不能等待
安装
composer require russbalabanov/tiny-rest
配置
请修改您的services.yaml
文件以注册这两个服务
...
TinyRest\Pagination\PaginationFactory:
TinyRest\RequestHandler:
传输对象
传输对象是HTTP请求的一个小型包装器。传输对象不应包含实体或将某些用户数据转换为复杂的自定义对象。一般思路是拥有一个有效的对象,它将包含纯用户数据
注解
属性
@Property(name="foo", mapped=true, type="datetime")
name
- 默认情况下,名称等于属性的名称,但在需要手动映射的情况下可以更改
mapped
- 是否将值设置到传输对象中。默认:true
type
- 有时候值需要被转换为特定类型,例如使用传输对象作为存储库的过滤器。以下类型可用于类型转换:string
,integer
,float
,array
,datetime
,boolean
。默认值是string
映射
应使用此注解来描述实体与传输策略。默认情况下,列名等于属性的名称。没有使用@Property()
注解时,无法使用此注解
@Mapping(column="someEntityField", mapped=true)
column
- 默认情况下,名称等于属性的名称,但在需要手动映射的情况下可以更改
mapped
- 可以设置为false,在这种情况下,属性不应将其数据传输到实体。默认:true
关系
@Relation(byField="slug")
当传输对象中的原始值应该转换为关系实体时,@Relation()
注解用于这些情况。
byField
- 默认:id
事件
OnObjectHydrated
/**
* @OnObjectHydrated(method="setTimestamp")
*/
class SomeClass implements TransferObjectInterface
{
private $timestamp;
public function setTimestamp()
{
$this->timestamp = time();
}
}
在对象加湿后触发,但在验证之前
OnObjectValid
/**
* @OnObjectHydrated(callback={"OtherClass", "getRandomNumber"})
*/
class SomeClass implements TransferObjectInterface
{
public $randomNumber;
}
class OtherClass
{
public static function getRandomNumber(SomeClass $object)
{
$object->randomNumber = mt_rand(1, 10);
}
}
在对象验证后触发
用法
创建、更新、列表和分页
所有操作的想法都是让用户更多地关注业务逻辑,而不是关注琐碎和常见的事情
创建
要从请求创建实体,您只需要三个参数。请求对象、传输对象(作为请求的小型包装器)和实体对象。
/**
* @var Product $product
*/
$product = $handler->create($request, new ProductTransferObject(), new Product());
$em->persit($product);
$em->flush();
更新
更新方法几乎与create()相同,只有一个例外。如果您正在执行PUT HTTP方法,则所有ORM字段(除了@Id)都将被清除
$handler->update($request, new ProductTransferObject(), $product);
$em->flush();
分页
use TinyRest\Pagination\PaginatedCollection
/**
* @var PaginatedCollection $collection
*/
$collection = $handler->getPaginatedList($request, new UserTransferObject(), $provider);
集合提供者
ORM
DBAL
原生查询
实体
数组
处理异常和发送API错误
当您不想过多地处理验证错误时,您可以选择这种解决方案。
class ExceptionSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
KernelEvents::EXCEPTION => 'onKernelException',
];
}
public function onKernelException(GetResponseForExceptionEvent $event)
{
$e = $event->getException();
if ($e instanceof ValidationException) {
$error = $this->createValidationMessage($e);
$response = new JsonResponse($error, 400);
$response->headers->set('Content-Type', 'application/problem+json');
$event->setResponse($response);
return $event;
}
return $event;
}
private function createValidationMessage(ValidationException $exception) : string
{
$violation = $exception->getViolationList()->get(0);
return sprintf('%s: %s', $violation->getPropertyPath(), $violation->getMessage());
}
}
警告:该项目目前处于alpha阶段,这意味着存在BC风险的可能性很小。