DDD in PHP Experiment
Domain-Driven Design in PHP Experiment and Project Seed
A current and difficult software development project has recently sent me scurrying for answers. In that search I’ve rediscovered the book Domain-Driven Design: Tackling Complexity in the Heart of Software by Eric Evans. In addition to re-reading the book and reviewing a handful of slide-decks at SlideShare; I have found that there a few different and even wide varying implementations of the principles of domain-driven design. So I have started a Github project to test out the implementation differences.
First, I am looking at the differences in the persistence and database access (DBAL) components in the infrastructure layer.
- For example one question that needs to be answered is should a DataMapper reside in the Domain or Infrastructure layer.
- Another is should the DataMapper be implemented following the pattern religiously or with application specific variations.
- Is it really a DataMapper or is it better called a DomainMapper that then uses TableDataGateways and RowDataGateways to read from persistence storage?
- Is there a DataMapper class in the infrastructure layer that communicates with the DomainMapper in the domain layer? That these two objects can pull from multiple tables using SQL and create a single entity or a single aggregate entity.
Second, I am looking at the differences in how domain classes versus infrastructure classes are constructed via factories.
- Which factory pattern is a best practice?
- If the factory method pattern is the best practice should it be implemented religiously or with variations?
Thirdly, where can I use things like
memcached
or an op-code cache to improve the performance of large data sets.- Data sets such as a repository might easily grow beyond a thousand aggregate root entities with maybe over tens times that in regular entities.
- Large data sets could easily cause the database syndrome known as ‘death by a thousand cuts’ meaning that a repository during a load process could easily ask the infrastructure layer to make a lot of database calls bringing the server to it’s knees.
Anyways, it should turn into a great learning experience.