A PHP 8.5+ DTO and Data library with immutable DTOs and mutable Data objects

Maintainers

Package info

github.com/jooservices/dto

pkg:composer/jooservices/dto

Transparency log

Statistics

Installs: 2 513

Dependents: 7

Suggesters: 1

Stars: 0

Open Issues: 0

v1.3.0 2026-07-21 01:15 UTC

README

codecov CI OpenSSF Scorecard PHP Version License: MIT Packagist Version

The JOOservices DTO Library is a PHP 8.5+ library for constructor-based DTO hydration, mutable data objects, opt-in validation, serialization control, and DTO collection wrappers.

Package name: jooservices/dto

Latest stable release: v1.3.0

Install

composer require jooservices/dto

Quick example

use DateTimeImmutable;
use JOOservices\Dto\Attributes\MapFrom;
use JOOservices\Dto\Core\Dto;

final class UserDto extends Dto
{
    public function __construct(
        public readonly string $id,
        #[MapFrom('email_address')]
        public readonly string $email,
        public readonly DateTimeImmutable $createdAt,
    ) {}
}

$user = UserDto::from([
    'id' => 'u_123',
    'email_address' => 'john@example.com',
    'createdAt' => '2026-01-15T10:30:00+00:00',
]);

$payload = $user->toArray();

What is supported today

  • Dto and Data
  • hydration from arrays, JSON strings, and simple public-property objects
  • scalar, enum, and DateTimeInterface casting
  • nested single DTO hydration
  • class-level polymorphic DTO hydration with #[DiscriminatorMap]
  • typed array hydration from common PHPDoc annotations such as Type[], array<Type>, and list<Type>
  • fallback property defaults with #[DefaultFrom]
  • opt-in validation with attributes
  • serialization filtering and wrapping
  • lazy derived serialization through ComputesLazyProperties
  • property-level #[Pipeline] and request-wide Context::$globalPipeline during hydration
  • DataCollection and PaginatedCollection

Important current limitations

  • deprecated placeholder attributes Computed, Deprecated, and OptionalProperty are not runtime-active (use ComputesLazyProperties, app-level deprecation, and nullable/defaults instead)
  • Context::$transformerMode remains reserved and is not behavior-defining
  • CastWith / TransformWith options are constructor-spread arguments for the configured class, not free-form bags passed into cast() / transform()

Documentation

Start with:

AI Support

This repository includes an AI skill pack for agents working in Cursor, Claude Code, VS Code, JetBrains, and Antigravity.

Start with:

The canonical skill source lives in .github/skills/, with adapter layers for each supported AI environment.

Development

composer lint
composer lint:all
composer test
composer test:coverage
composer check
composer ci

Contributor workflow details live in:

Approved Git flow summary:

  • normal feature and fix work branches from develop and PRs back into develop
  • release preparation uses release/<version> from develop, then PRs into master
  • releases are tagged from master
  • master merges back into develop after release or hotfix completion

Community

GitHub Actions and Services

Current GitHub Actions coverage:

  • CI: security checks, linting, tests, 95% minimum statement coverage, coverage upload, and optional SonarQube Cloud analysis when SONAR_TOKEN is configured
  • Release: validate tags, create GitHub releases, trigger Packagist update
  • PR Labeler: apply labels to pull requests
  • Semantic PR Title: enforce pull request title format
  • OpenSSF Scorecard: publish scorecard results as SARIF
  • Secret Scanning: workflow file exists, but the gitleaks job is currently disabled

External services currently used by workflows:

Important notes:

  • No workflow currently defines Docker-style services: containers such as MySQL, Redis, or PostgreSQL.
  • SonarQube Cloud analysis is present in ci.yml, but it only runs after tests pass and only when SONAR_TOKEN is available.

License

This project is licensed under the MIT License.