rekalogikaapi-lite

一套简化项目中使用API平台的工具。包含指南、模式和构建基于API平台的项目的实用示例。

资助包维护!
priyadi

安装次数: 859

依赖者: 0

建议者: 0

安全: 0

星标: 3

关注者: 1

分支: 0

公开问题: 1

类型:symfony-bundle

v0.7.7 2024-09-17 01:52 UTC

README

一套简化项目中使用API Platform的工具。包含指南、模式和构建基于API平台的项目的实用示例。

应用现有的知识、经验和使用Symfony控制器工作的模式到API Platform状态提供者和处理器。将持久化层与API前端层解耦。将领域驱动设计(DDD)原则应用到基于API平台的项目中,以及其他架构模式和最佳实践,包括SOLID、洋葱架构、清洁架构、六边形架构等。

“Lite”意味着我们更倾向于使用更好的可读性、简洁性和灵活性,而不是使用API Platform的所有特性和自动化功能。

完整文档可在rekalogika.dev/api-lite找到。

动机

API Platform文档鼓励开发者使用普通PHP对象(POPO)或数据传输对象(DTO)作为API通信的模型,而不是直接使用领域实体。但并未为这种做法建立实际的工作模式。

我们在网上找到的几乎所有示例和演示都将ApiResource附加到Doctrine实体上。

有时API Platform可能会感觉非常僵化。很难弄清楚如何完成其常规之外的事情。任何问题都有解决方法,只是不一定立即显而易见。可能会感觉我们只想通过编写PHP代码来表达我们的需求,而不是通过确定要使用的正确属性组合。

来自Symfony控制器的人可能会发现API Platform的方法非常不同,但不必如此。

安装

composer require rekalogika/api-lite

概要

use Doctrine\Common\Collections\Collection;
use Rekalogika\ApiLite\State\AbstractProvider;
use Rekalogika\Mapper\CollectionInterface;

#[ApiResource(
    shortName: 'Book',
    operations: [
        new Get(
            uriTemplate: '/books/{id}',
            provider: BookProvider::class
        ),
    ]
)]
class BookDto
{
    public ?Uuid $id = null;
    public ?string $title = null;
    public ?string $description = null;

    /**
     * @var ?CollectionInterface<int,ReviewDto>
     */
    public ?CollectionInterface $reviews = null;
}

/**
 * @extends AbstractProvider<BookDto>
 */
class BookProvider extends AbstractProvider
{
    public function __construct(
        private BookRepository $bookRepository
    ) {
    }

    public function provide(
        Operation $operation,
        array $uriVariables = [],
        array $context = []
    ): object|array|null {
        $book = $this->bookRepository
            ->find($uriVariables['id'] ?? null)
            ?? throw new NotFoundException('Book not found');

        $this->denyAccessUnlessGranted('view', $book);

        return $this->map($book, BookDto::class);
    }
}

待办事项列表

  • 找出并实现过滤。

文档

rekalogika.dev/api-lite

许可证

MIT