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:
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