PHPackages                             kuaukutsu/ds-dto - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. kuaukutsu/ds-dto

AbandonedArchivedLibrary

kuaukutsu/ds-dto
================

Data Structure: DTO (Data Transfer Object)

2.0.2(2y ago)02.2k[1 PRs](https://github.com/kuaukutsu/ds-dto/pulls)BSD-3-ClausePHPPHP ^8.1

Since Nov 4Pushed 2y ago1 watchersCompare

[ Source](https://github.com/kuaukutsu/ds-dto)[ Packagist](https://packagist.org/packages/kuaukutsu/ds-dto)[ RSS](/packages/kuaukutsu-ds-dto/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (2)Dependencies (12)Versions (13)Used By (0)

DTO (Data Transfer Object)
==========================

[](#dto-data-transfer-object)

Disclaimer: вставлю свои 5 копеек, не претендую на истинность, но мысли озвучу (в самых общих чертах).

Словарь используемых терминов:
------------------------------

[](#словарь-используемых-терминов)

- **Form** получение данных извне (request: POST/GET/ARGS/Array), обработка (валидация, фильтрация), передача в сервисный слой (бизнес логика).
- **Model** какое-то объектное представления данных в системе (инфрастркутура, repository).
- **Service** различные сервисы (UoW, UseCase), обработка бизнес логики.
- **DTO** транспорт, плюс схема данных (комментарии могут рассказывать о том, как и где используются данные). Есть возможность быстро организовать версионность массива данных.

Схема для описания примера
--------------------------

[](#схема-для-описания-примера)

В самом простом исполнении получается следующая схема:

```
interface Form extends Dtoable
{
    /**
     * Конвертирует объект в массив.
     *
     * @param string[] $fields поля которые должны быть в исходном массиве
     * @return array
     */
    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**
--------------

[](#пример-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-&gt;toArray()), и так же получать из сервисного слоя напрямую модель. Суть в том, что Модель, как и Форма, это реализация некоторой логики, и в приложении могут быть несколько компонент, которые реализуют логику субъективно, по своему, с учётом требований БЛ, но сервисный слой для всех компонент один и тот же. Поэтому нужен механизм, который позволит 3-м разным формам работать с одним методом, как например $service-&gt;save(DTO). А так же потому что форма, как любой иной объект может менять своё состояние, и нет чётких гарантий неизменности данных.

```
class Service
{
    public function save(DtoInterface $dto): bool
    {
        $data = $dto->toArray();

        ...

        return true;
    }
}
```

Docker
------

[](#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
-------

[](#testing)

### Unit testing

[](#unit-testing)

The package is tested with [PHPUnit](https://phpunit.de/). To run tests:

```
make phpunit
```

### Static analysis

[](#static-analysis)

The code is statically analyzed with [Psalm](https://psalm.dev/). To run static analysis:

```
make psalm
```

### Code Sniffer

[](#code-sniffer)

```
make phpcs
```

### Rector

[](#rector)

```
make rector
```

###  Health Score

32

—

LowBetter than 72% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity15

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity69

Established project with proven stability

 Bus Factor1

Top contributor holds 97.8% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~108 days

Recently: every ~176 days

Total

11

Last Release

926d ago

Major Versions

1.3.2 → 2.0.12023-10-14

PHP version history (2 changes)1.0.0PHP &gt;=7.4

2.0.1PHP ^8.1

### Community

Maintainers

![](https://www.gravatar.com/avatar/d2c971edefc6f184c1a048e4c4fbc764c5398f3ba34a8193e81b14ae059a874d?d=identicon)[kuaukutsu](/maintainers/kuaukutsu)

---

Top Contributors

[![kuaukutsu](https://avatars.githubusercontent.com/u/647093?v=4)](https://github.com/kuaukutsu "kuaukutsu (44 commits)")[![stack-file[bot]](https://avatars.githubusercontent.com/in/408123?v=4)](https://github.com/stack-file[bot] "stack-file[bot] (1 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPsalm, Rector

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/kuaukutsu-ds-dto/health.svg)

```
[![Health](https://phpackages.com/badges/kuaukutsu-ds-dto/health.svg)](https://phpackages.com/packages/kuaukutsu-ds-dto)
```

###  Alternatives

[yiisoft/validator

Yii Validator

164367.7k20](/packages/yiisoft-validator)[yiisoft/html

Handy library to generate HTML

57535.5k43](/packages/yiisoft-html)[yiisoft/view

Yii View Rendering Library

57382.5k19](/packages/yiisoft-view)[yiisoft/arrays

Yii Array Helper

562.0M56](/packages/yiisoft-arrays)[yiisoft/config

Composer plugin and a library for config assembling

34368.9k27](/packages/yiisoft-config)[yiisoft/files

Helper to manage files and directories

361.3M55](/packages/yiisoft-files)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
