russbalabanov/tiny-rest

1.3.10 2020-07-10 10:22 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 - 有时候值需要被转换为特定类型,例如使用传输对象作为存储库的过滤器。以下类型可用于类型转换:stringintegerfloatarraydatetimeboolean。默认值是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风险的可能性很小。

您喜欢这个项目吗?点击星星按钮,这将激励我让它变得更好!