kuaukutsu/ds-dto
最新稳定版本:2.0.2
Composer 安装命令:
composer require kuaukutsu/ds-dto
包简介
Data Structure: DTO (Data Transfer Object)
README 文档
README
Disclaimer: вставлю свои 5 копеек, не претендую на истинность, но мысли озвучу (в самых общих чертах).
Словарь используемых терминов:
- Form получение данных извне (request: POST/GET/ARGS/Array), обработка (валидация, фильтрация), передача в сервисный слой (бизнес логика).
- Model какое-то объектное представления данных в системе (инфрастркутура, repository).
- Service различные сервисы (UoW, UseCase), обработка бизнес логики.
- DTO транспорт, плюс схема данных (комментарии могут рассказывать о том, как и где используются данные). Есть возможность быстро организовать версионность массива данных.
Схема для описания примера
В самом простом исполнении получается следующая схема:
interface Form extends Dtoable { /** * Конвертирует объект в массив. * * @param string[] $fields поля которые должны быть в исходном массиве * @return array<string, mixed> */ public function toArray(array $fields = []): array; /** * Форма содержит данные, их нужно передать в сервис (например, Service). * * @param class-string $dtoClassName */ public function toDto(string $dtoClassName): DtoInterface; }
interface Model { public function fromDto(DtoInterface $dto): self; }
interface Service { public function save(DtoInterface $dto): bool; }
Пример DTO
Подходы могут быть разные, но лично мне не нравится передавать данные через конструктор, возможно с приходом php8 и named arguments я поменяю точку зрения.
/** * @psalm-immutable */ final class ModelDto extends BaseDto { public int $id; public string $name; /** * nullable в данном случае говорит что значение при Инициализации объекта может быть незадано. */ public ?array $props = []; }
В DTO можно использовать protected свойства (плюс геттеры), чтобы не было желания заполнять их как-то кроме как
через hydrate(). Главное - иммутабельность и никакой логики, как только здесь появляется логика, это сразу
превращается в Entity, или быть может какой-то иной подвид Value Object.
Может возникнуть вопрос, зачем здесь DTO, ведь в сервисный слой можно передавать форму напрямую ($form или в виде массива $form->toArray()), и так же получать из сервисного слоя напрямую модель. Суть в том, что Модель, как и Форма, это реализация некоторой логики, и в приложении могут быть несколько компонент, которые реализуют логику субъективно, по своему, с учётом требований БЛ, но сервисный слой для всех компонент один и тот же. Поэтому нужен механизм, который позволит 3-м разным формам работать с одним методом, как например $service->save(DTO). А так же потому что форма, как любой иной объект может менять своё состояние, и нет чётких гарантий неизменности данных.
class Service { public function save(DtoInterface $dto): bool { $data = $dto->toArray(); ... return true; } }
Docker
docker pull ghcr.io/kuaukutsu/php:8.1-cli
Container:
ghcr.io/kuaukutsu/php:${PHP_VERSION}-cli(default)jakzal/phpqa:php${PHP_VERSION}
shell
docker run --init -it --rm -v "$(pwd):/app" -w /app ghcr.io/kuaukutsu/php:8.1-cli sh
Testing
Unit testing
The package is tested with PHPUnit. To run tests:
make phpunit
Static analysis
The code is statically analyzed with Psalm. To run static analysis:
make psalm
Code Sniffer
make phpcs
Rector
make rector
kuaukutsu/ds-dto 适用场景与选型建议
kuaukutsu/ds-dto 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 2.17k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2023 年 10 月 14 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 kuaukutsu/ds-dto 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 kuaukutsu/ds-dto 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 2.17k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 7
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: BSD-3-Clause
- 更新时间: 2023-10-14