dereuromark/cakephp-dto

CakePHP DTO Plugin

Installs: 15

Dependents: 0

Suggesters: 0

Stars: 5

Watchers: 4

Forks: 3

Open Issues: 0

Type:cakephp-plugin

0.1 2018-12-08 23:21 UTC

README

Build Status codecov Minimum PHP Version License Total Downloads Coding Standards

A Data Transfer Object (DTO) is an object used to pass typed data between layers in your application, similar in concept to Structs in C, Martin Fowler's Transfer Objects, or Value Objects.

The goal of this package is to structure "unstructured data", replacing simple (associative) arrays with a more speaking solution.

  • By making all fields typeable, we can be sure that their values are never something we didn't expect. Especially with PHP 7.1 and more strict typehinting moving forward this is rather important to detect and fail early.
  • We can have full IDE autocomplete and typehinting.
  • We can use tools like PHPStan to statically analyze the code (more strictly).
  • We can simplify the logic where required fields will now just throw a meaningful exception.
  • We can work with different inflections of field names more easily.
  • Easy way of immutable DTOs with required fields, to trust them in following code.

For more see Motivation and Background.

This plugin will provide you with a tool to quickly generate custom and optimized DTOs for your special use cases.

Examples

See Examples for basic, immutable and complex entity use cases. The generated demo DTOs of those are in tests/test_app/src/Dto/.

Note: They are 5.6+ as per min requirement, but you can easily generate them as 7.1+ and strict types on as well :) In fact, that is the default if your PHP setup matches locally.

Installation

You can install this plugin into your CakePHP application using Composer.

The recommended way to install is:

composer require dereuromark/cakephp-dto

Then load the plugin with the following command:

bin/cake plugin load dereuromark/cakephp-dto -b

The bootstrap is needed for the TwigView events to be set up. If you already included TwigView, you might not need the bootstrap.

Usage

See Docs for details.