hradigital / php-datatypes
Easy way to build up and sanitize your application objects.
Requires
- php: ^8.1
- ext-intl: *
Requires (Dev)
- phpunit/phpunit: ^9.0
- squizlabs/php_codesniffer: ^3.0@dev || ^4.0
README
Master branch build status
Code Usage
This package is mean to provide you an easy way to do this (and much more):
$user = new User([ 'id' => 123, 'active' => true, 'name' => ' John Doe ', ]); echo $user->getId(); // (int) 123 echo $user->isActive(); // (bool) true echo $user->getName(); // Prints ' John Doe ' echo $user->getName()->trim()->toUpper()->replace(' ', '-'); // Prints 'JOHN-DOE' echo $user->getName(); // Prints ' John Doe ' again, as Attribute is immutable.
... just by building your object like this:
class User extends AbstractValueObject { use HasPositiveIntegerIDTrait, HasActiveTrait, HasNameTrait; }
Also, out-of-box, it will allow you to do the following:
$user = new User([ 'id' => 123, 'active' => true, 'name' => ' John Doe ', ]); echo json_encode($user); // {"id":123,"active":true,"name":"John Doe"} $serialized = serialize($user); $otherUser = unserialize($serialized); printf($otherUser->toArray()); /* [ 'id' => 123, 'active' => true, 'name' => 'John Doe', ] */
... and much more. This will leave your objects clean from repetitive state management code, which frees you to implement your business logic in them.
In order to learn more about the code, please go here.
About
PHP Datatypes is meant to provide an easy way to create your Value Objects/Entities/Aggregates, in a fast and platform agnostic way, that promotes:
- Code reusability
- Data normalization
- Type hint enforcement
- Full data serializing
- No 3rd party dependency apart from PHP. Clean/Self reliant project.
An Aggregate/Entity/ValueObject that extends AbstractValueObject will be built using predefined/tested Traits for each of the class attributes, leaving your class definition cleaned/free for your business logic implementation.
This will also allow you to reuse/load your objects with data that can come from a Database, Webservice, Event payload, etc...
Getters/Accessors for class attributes will return ValueObjects instead of primitive types, as much as possible. All these datatypes will also be included in the package, as it doesn't have any dependencies apart from, PHP itself.
To learn how to use this package, please go to AbstractValueObject documentation.
Inspiration
Some of the projects that inspired this one, are mainly Nikita Popov's Scalar Objects, but also Martin Helmich's Scalar Classes and Michael Hall's Datatypes.
Due to the "No 3rd party dependency" rule, this package will use some simplified versions of more popular datatypes. Some examples are:
- synfony/string, for String related manipulations.
- nesbot/carbon, for DateTime manipulations.
- ...
Requirements & Installation
- PHP >= 8.1
ext-intl
composer require hradigital/php-datatypes
Usage
For more information about how to to use these Datatypes, please see the project's usage notes and some implementation examples in here.
Continuous Integration & Testing
The project is validated on every push and pull request through GitHub Actions. The CI pipeline runs:
- Coding Standards -
PSR2checks viaPHP_CodeSniffer. - Tests - the full
PHPUnitsuite against PHP8.1,8.2,8.3,8.4and8.5, each running inside its own officialphp:<version>-cliDocker container. - Code Coverage - a
cloverreport generated withpcovand uploaded to Codecov.
Composer scripts are available to run the same checks locally:
composer run test-cs # Coding standards (PSR2) over src/ composer run test-code # PHPUnit suite with coverage + JUnit reports (written to ci/) composer run test-all # Runs both of the above
To run the test suite without a coverage driver installed:
./vendor/bin/phpunit --no-coverage
Contributing
Contributing to the project is easy and contributions are welcomed and appreciated.
It's obviously harder to maintain the project alone, but efforts will be made to keep and improve it, as I plan to use it as a dependency in other projects.