
Modeling Aggregates, Entities and Value Objects
Complex Heart allows you to model your domain Aggregates, Entities, and Value Objects using a set of traits. Great, but
why traits and not classes? Well, sometimes you have some kind of inheritance in your classes. Being forced to use a
certain base class is too invasive and personally, I don't like it. By using a set of traits and interfaces you have all
the functionality you need without compromising the essence of your own domain.
The available traits are:
- HasAttributes Provide some functionality to manage attributes.
- HasEquality Provide functionality to handle equality between objects.
- HasInvariants Allow invariant checking on instantiation (Guard Clause).
- HasIdentity Define the Entity/Aggregate identity.
- HasDomainEvents Provide domain event management.
On top of those base traits Complex Heart provide ready to use compositions:
- IsModel composed by HasAttributes and HasInvariants.
- IsValueObject composed by IsModel and HasEquality.
- IsEntity composed by IsModel, HasIdentity, HasEquality.
- IsAggregate composed by IsEntity, HasDomainEvents.
- Type-Safe Factory Method: The make() static factory validates constructor parameters at runtime with clear error messages
- Automatic Invariant Checking: When using make(), Value Objects and Entities automatically validate invariants after construction (no manual $this->check() needed)
- Named Parameter Support: Full support for PHP 8.0+ named parameters for improved readability and flexibility
- Union Type Support: Complete support for PHP 8.0+ union types (e.g., int|float, string|null)
- Readonly Properties Support: Full compatibility with PHP 8.1+ readonly properties
- PHPStan Level 8: Complete static analysis support
Note: Automatic invariant checking only works when using the make() factory method. Direct constructor calls require manual $this->check() in the constructor.
For more information and usage examples, please check the wiki.