rekalogika/api-lite
一套简化项目中使用API平台的工具。包含指南、模式和构建基于API平台的项目的实用示例。
v0.7.7
2024-09-17 01:52 UTC
Requires
- php: >=8.2
- api-platform/core: ^3.2.12 || ^3.3
- doctrine/collections: ^2.2
- rekalogika/mapper: ^1.1
- rekalogika/rekapager-api-platform: ^0.18
- rekalogika/rekapager-doctrine-collections-adapter: ^0.18
- rekalogika/rekapager-doctrine-orm-adapter: ^0.18
- symfony/dependency-injection: ^6.4 || ^7.0
- symfony/http-kernel: ^6.4 || ^7.0
- symfony/security-core: ^6.4 || ^7.0
- symfony/service-contracts: ^3.4
Requires (Dev)
- bnf/phpstan-psr-container: ^1.0
- doctrine/doctrine-bundle: ^2.12
- doctrine/doctrine-fixtures-bundle: ^3.5
- doctrine/orm: ^2.14 || ^3.0
- doctrine/persistence: ^3.1
- ekino/phpstan-banned-code: ^2.1
- fakerphp/faker: ^1.23
- pagerfanta/core: ^4.3
- phpstan/phpstan: ^1.12
- phpstan/phpstan-deprecation-rules: ^1.1
- phpstan/phpstan-phpunit: ^1.3
- phpunit/phpunit: ^10.5
- psalm/plugin-phpunit: ^0.19.0
- rekalogika/doctrine-collections-decorator: ^2.2
- symfony/asset: ^6.4 || ^7.0
- symfony/browser-kit: ^6.4 || ^7.0
- symfony/debug-bundle: ^6.4 || ^7.0
- symfony/doctrine-bridge: ^6.4 || ^7.0
- symfony/event-dispatcher: ^6.4 || ^7.0
- symfony/expression-language: ^6.4 || ^7.0
- symfony/framework-bundle: ^6.4 || ^7.0
- symfony/http-client: ^6.4 || ^7.0
- symfony/maker-bundle: ^1.55
- symfony/property-access: ^6.4.4 || ^7.0.4 || ^7.1
- symfony/property-info: 6.4.0 - 6.4.8 || 7.0.0 - 7.0.8 || 7.1.0 - 7.1.1 || ^7.2
- symfony/routing: ^6.4 || ^7.0
- symfony/runtime: ^6.4 || ^7.0
- symfony/security-bundle: ^6.4 || ^7.0
- symfony/serializer: ^6.4.2 || ^7.0.2 || ^7.1
- symfony/twig-bundle: ^6.4 || ^7.0
- symfony/uid: ^6.4 || ^7.0
- symfony/validator: ^6.4 || ^7.0
- symfony/var-dumper: ^6.4 || ^7.0
- symfony/var-exporter: ^6.4.4 || ^7.0.4 || ^7.1
- symfony/web-profiler-bundle: ^6.4 || ^7.0
- symfony/yaml: ^6.4 || ^7.0
- twig/twig: ^3.8
- vimeo/psalm: ^5.26
- zenstruck/foundry: 1.37.*
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); } }
待办事项列表
- 找出并实现过滤。
文档
许可证
MIT