Refactorizando de MVC a DDD Parte I - Introducción

Introducción

Después de haber visto varios videos de Carlos Buenosvinos, Codely Tv y algún autor más, he decidido crear un conjunto de posts basados en una refactorización de una arquitectura habitual de MVC e intentar migrarla a DDD (Domain Driven Design).
El ejercicio consiste en la aplicación de un blog que tiene una entrada a la que vamos a marcar su flag de publicación (status=1) para que posteriormente se persistan los cambios en la base de datos. A continuación y como último paso visualizarla con su estado actualizado Published.
La idea original es de Carlos B, la podeis conseguir en su playlist de #rigortalks, con algo de carpintería aplicada de mi parte.
Por otro lado advertir que no soy un experto en DDD ni arquitecturas limpias. Para eso teneis cursos muy interesantes en Codely y un libro que sugiero es: Domain-Driven Design in PHP: A Highly Practical Guide
El fin real de este conjunto de artículos es marcar un punto de entrada a DDD y aterrizar conceptos de la forma que me hubiera gustado que me lo explicaran. En definitiva, refactorizando

Sobre el repositorio inicial

Suelo usar Docker para todos mis POC. En este caso no lo he hecho porque hay gente que todavia sigue con XAMPP en windows. La idea es que se puedan descargar el código y ejecutarlo.

No se necesita ningún framework

Necesitas

  • Php 7.4 o superior. En mi caso he usado 8
  • Composer (opcional) ya que lo único que se instala es PHPUnit y en esta versión no hay tests
  • Descargar el blog-publish-mvc-v1
  • Descartar mensajes de pull requests. Hay varios avisos de dependanbot tienen que ver con otras carpetas que no intervienen en el ejercicio.

Para arrancar

En la terminal. Hay que posicionarse en la carpeta: blog-publish-mvc-v1 y ejecutar make server o en caso contrario php -S localhost:2000 -t ./public
Si todo ha ido bien se debería ver lo siguiente:
refactorizando de mvc a ddd introducción
Las trazas en amarillo sirven para hacer un seguimiento según se van aplicando cambios. Estas siempre deberían verse igual.

Estructura de archivos

├── composer.json ├── makefile //server: permite arrancar el proyecto por el puerto 2000. ├── public │   └── index.php //es el frontcontroller que crea una instancia de PublishController └── src ├── Blog │   ├── Controllers │   │   └── PublishController.php //el único controlador que recibe la request y marca el flag │   ├── Models │   │   ├── PostEntity.php │   │   ├── Repositories │   │   │   ├── PostRepository.php │   │   │   └── UserRepository.php │   │   └── UserEntity.php │   ├── Utils //librerias y/o componentes varios │   │   ├── Monolog.php │   │   ├── RequestTrait.php //wrapper de $_POST, $_GET, $_SESSION │   │   └── ViewTrait.php //permite hacer include de lo que hay en Views y pasarle variables a la vista │   └── Views │   └── post-published.php └── autoload.php //permite usar "use" en lugar de include para la importación de clases //esto lo suele gestionar composer/autoload pero en el ejemplo no aplica

Autor: Eduardo A. F.
Publicado: 10-04-2022 01:06
Actualizado: 22-04-2022 20:43