CursosWorkshop IAEmpresasPreciosBlogNewsletter
  • Cursos
  • Workshop IA
  • Empresas
  • Precios
  • Blog
  • Newsletter
Suscríbete
  • Cursos
  • Empresas
  • Comunidades
  • Blog
  • Tarjeta regalo
  • Newsletter
  • Soporte
  • Tienda
  • ConfAiBot
  • Contacta
  • Aviso legal
  • Condiciones generales
  • Política de privacidad
  • Política de cookies

Curso de DDD en PHP

Standard
Rafa GómezJavier Ferrer

Por Rafa Gómez y Javier Ferrer – Diseño y Arquitectura de Software

Crea paso a paso tu aplicación PHP siguiendo Domain-Driven Design. Estructura de carpetas, integración con BD, sistema de colas, CQRS y más.

Ir al curso

💸 ¡Primera lección disponible sin registro!

Curso completo para crear aplicaciones en PHP siguiendo los patrones tácticos y estratégicos de DDD

Qué veremos en este curso de Domain-Driven Design en PHP

  • [Gratis] 📖 Creación del proyecto: Bounded Context y Submodules - Estructura carpetas
    • 🎥 Bienvenida al curso: Objetivos, ¿qué aprenderás?
    • 🎥 Estructura de carpetas: DDD en PHP
  • 📖 Health check de la aplicación: Nuestro primer endpoint
    • 🎥 Crear Endpoint de health check
    • 🎥 Contenedor de inyección de dependencias: Controller como servicio
    • 🎥 Añadir tests de aceptación con Behat
  • 📖 Desarrollo Outside-in: Implementación del caso de uso para crear curso
    • 🎥 Implementación del endpoint y test de aceptación
    • 🎥 Integrar PhpUnit para test unitarios
    • 🎥 Implementación del caso de uso y test unitario
    • 🎥 Implementación del repositorio en fichero y test de integración
  • 📖 Modelando el dominio: Agregado Course
    • 🎥 Utilizando objetos Request y Response para comunicarnos con el Application Service
    • 🎥 Refacoting a UUIDs como identificadores
    • 🎥 Value Objects: Immutabilidad y tips para agilizar desarrollo
  • 📖 Modelando el dominio: Implicaciones en tests
    • 🎥 Patrón ObjectMother para nuestros tests
    • 🎥 Tests más semánticos
  • 📖 Guardar en base de datos con Doctrine
    • 🎥 Integración de Doctrine
    • 🎥 Mapeo de modelos en Doctrine: Custom Types vs Embeddables
    • 🎥 Implementación del repositorio para MySQL y test de integración
    • 🎥 Discriminator Map con Hibernate
  • 📖 Alternativa: Repositorios con Active Record - Eloquent
    • 🎥 Integrando Eloquent y diferencias entre Active Record y Data Mapper
    • 🎥 DDD en Laravel: Escondiendo Eloquent en infraestructura
  • 📖 Eventos de dominio síncronos con Symfony Messenger: Incrementar el total de cursos
    • 🎥 Integración de Symfony Messenger y adapter interface EventBus
    • 🎥 Publicación y suscripción de eventos de dominio y test de aceptación
    • 🎥 Idempotencia al consumir eventos: Implementación del caso de uso y test unitario
  • 📖 Testeando “parcialmente”: PhpUnit SimilarComprator
    • 🎥 Añadiendo Mockery
    • 🎥 Testeando guardar en el repositorio con eventos de dominio en el agregado
    • 🎥 Alternativa: publicar eventos desde agregados
  • 📖 Eventos de dominio asíncronos - MySQL
    • 🎥 Guardado de eventos de dominio en MySQL
    • 🎥 Consumir eventos de dominio desde MySQL
    • 🎥 Polling de base de datos para recuperar eventos
  • 📖 Publicar eventos de dominio asíncronos y escalables utilizando RabbitMQ
    • 🎥 Publicar eventos en RabbitMQ desde PHP
    • 🎥 Añadiendo un fallback a la publicación de eventos de dominio
  • 📖 Consumir eventos con RabbitMQ
    • 🎥 Generar la configuración del RabbitMQ automáticamente
    • 🎥 Consumir eventos en RabbitMQ desde PHP
    • 🎥 Supervisord y tips PHP
    • 🎥 Gestión de errores al consumir con RabbitMQ
  • 📖 CQRS
    • 🎥 Integración de Symfony Messenger como Command Bus
    • 🎥 Refactoring añadiendo CQRS a Arquitectura Hexagonal
    • 🎥 Integración y refactor a Query Bus
  • 📖 Bounded Contexts y módulos
    • 🎥 Crear módulo de Notificaciones
    • 🎥 Promocionar Módulo Notificaciones a Bounded Context de Retención
  • 📖 Frontend web
    • 🎥 Dando de alta una nueva aplicación: Backoffice Frontend
    • 🎥 Integración con Twig
    • 🎥 Mostrar contador de cursos vía query desde Controller
    • 🎥 Crear curso: Dónde ubicar validaciones de comandos
  • 📖 Backoffice
    • 🎥 Listado de cursos: Mantener proyección de cursos
    • 🎥 Filtrado de elementos: Patrón Criteria/Specification
  • 📖 Optimizando rendimiento en Read Model - Moviéndonos a NoSQL: Elasticsearch al rescate
    • 🎥 Primera importación de datos a Elasticsearch
    • 🎥 Mantener sincronizada la proyección de Elasticsearch
    • 🎥 Patrón Criteria/Specification con Elasticsearch
  • 📖 Optimizando rendimiento - Más allá de Elasticsearch: Optimizaciones MySQL, caching web y más
  • 📖Autorización
  • 📖Preguntas frecuentes
  • 📖 Conclusión y siguientes pasos

Cursos relacionados

Este curso complementa los cursos de:

  • Principios SOLID Aplicados
  • Arquitectura Hexagonal
  • Testing: Introducción y buenas prácticas
  • CQRS: Command-Query Responsibility Segregation
  • Comunicación entre [micro]servicios con Event-Driven Architecture
  • Domain-Driven Design

Te recomendamos que si es la primera vez que escuchas sobre estos conceptos, primeros hagas los cursos del listado y vuelvas una vez los hayas hecho a este. Así podrás tener los conceptos más claros y aprovechar mucho más este curso, ya que vamos a ir por faena 😬🚀

¡Sólo por 29€ tienes acceso a todos los cursos!

Vídeo de introducción

Aquí el primer vídeo del curso para que te hagas una idea de la calidad del contenido 😬

Vídeos del curso

  • [Gratis] Bienvenida al curso: Objetivos, ¿qué haremos?
  • [Gratis] Estructura de carpetas y acelerando la creación del proyecto
  • ¡Repasemos!
  • ¡A practicar! Estructura del proyecto

  • Crear Endpoint de health check
  • Contenedor de inyección de dependencias: Controller como servicio
  • Añadir tests de aceptación con Behat
  • ¡Repasemos!
  • ¡A practicar! Controller enriquecido

  • Implementación del test de aceptación y controller
  • Integrar PhpUnit para test unitarios
  • Implementación del caso de uso y test unitario
  • Implementación del repositorio en fichero y test de integración
  • ¡Repasemos!
  • ¡A practicar! Añadiendo un Caso de uso

  • Utilizando objetos Request y Response para comunicarnos con el Application Service
  • Refactoring a UUIDs como identificadores
  • Value Objects: Inmutabilidad y tips para agilizar desarrollo
  • ¡Repasemos!
  • ¡A practicar! Utilizando Requests

  • Patrón ObjectMother para nuestros tests
  • Tests más semánticos
  • ¡Repasemos!
  • ¡A practicar! ObjectMothers para nuestros usuarios

  • Integración de Doctrine
  • Mapeo de modelos en Doctrine Custom Types vs Embeddables
  • Implementación del repositorio para MySQL y test de integración
  • Discriminator Map con Doctrine
  • ¡Repasemos!
  • ¡A practicar! Implementar el repositorio

  • Integrando Eloquent y diferencias entre Active Record y Data Mapper
  • Repositorios con Eloquent: Escondiendo en la infraestructura la contaminación
  • ¡Repasemos!
  • ¡A practicar! Utiliza Active Record

  • 📩 Integración de Symfony Messenger y adapter interface EventBus
  • 🥳 Publicación y suscripción de eventos de dominio y test de aceptación
  • 🤟 Idempotencia al consumir eventos: Implementación del caso de uso y test unitario
  • ¡Repasemos!
  • ¡A practicar! Usuario registrado

  • 🤡 Añadiendo Mockery
  • 🤷‍♀️ Testeando guardar en el repositorio con eventos de dominio en el agregado
  • 🤔 Alternativa: Publicar eventos desde agregados
  • ¡Repasemos!
  • ¡A practicar! Test para UsersCounter

  • 🥡 Guardado de eventos de dominio en MySQL
  • 👾 Consumir eventos de dominio desde MySql
  • 🤖 Comando para el consumidor de eventos de dominio
  • ¡Repasemos!
  • ¡A practicar! Consumidor selectivo

  • 🐰 Publicar eventos en RabbitMQ
  • 🙆‍♂️ Error al publicar eventos: Fallback en MySql
  • ¡Repasemos!
  • ¡A practicar! Añade un fallback

  • 🎱 Crear infraestructura en RabbitMQ automáticamente: CI pipelines FTW
  • 🌬 Consumir eventos desde RabbitMQ
  • 🤓 Generar config SupervisorD automáticamente y tips PHP
  • 🙅🏾‍♂️ Gestión de errores al consumir con RabbitMQ: Colas de retry y dead letter
  • ¡Repasemos!
  • ¡A practicar! Gestiona colas en RabbitMQ

  • 🥁 Integración de Symfony Messenger como Command Bus
  • ♻️ Refactoring de Arquitectura Hexagonal a CQRS
  • ♻️ … 🚌💨 Integración y refactor a QueryBus
  • ¡Repasemos!
  • ¡A practicar! Registra usuarios con un Command

  • 📧 Crear módulo de notificaciones
  • 🆙 Promocionar el módulo notificaciones a Bounded Context
  • 🐣 Dando de alta una nueva aplicación: Backoffice Frontend
  • ¡Repasemos!
  • ¡A practicar! Crea un nuevo módulo

  • 🎍 Integración con Twig
  • ⑩ Contador de cursos vía query desde Controller
  • 🎓 Crear curso: Formulario y command desde Controller
  • 👀 Crear curso: Dónde ubicar validaciones de comandos
  • ¡Repasemos!
  • ¡A practicar! Formulario para registrar usuarios

  • 🚦 Listado de cursos: Mantener proyección de cursos en Backoffice
  • 🚁 Filtrado de elementos: Patrón Criteria/Specification
  • 🐋 Filtrado de elementos: Patrón Criteria en MySQL
  • ¡Repasemos!
  • ¡A practicar! Creando proyecciones

  • 🐣 Integración de Elasticsearch
  • ♻️ Mantener sincronizada la proyección de Elasticsearch
  • 🍃 Patrón Criteria/Specification con Elasticsearch
  • ¡Repasemos!
  • ¡A practicar! Integra Elasticsearch

  • ✋ Separando el contexto de mooc de backoffice
  • 🤚 Extraer aplicación backoffice backend
  • ¡Repasemos!
  • ¡A practicar! Crea una nueva App

  • 🗣️ Cache de cliente: ETag, max expire, y demás amigos de HTTP
  • 🦐 Alternativas de cache en servidor
  • 🦷 Cache de servidor: Optimizar casos de uso sin ensuciar el dominio
  • ¡Repasemos!
  • ¡A practicar! Utiliza la cache

  • 🕳 Dónde comprobar permisos de usuarios y qué info añadir en los eventos
  • ✋ Implementación con basic auth HTTP
  • 👌 Modelando el concepto "Auth"
  • 🤝 Alternativas con oAuth y ACLs
  • ¡Repasemos!
  • ¡A practicar! Securizando el Mooc

  • 👂 Subscriber a todos los eventos
  • 🤕 Gestión de errores
  • 😮 Casos de uso complejos que requieren información de varios contextos
  • ¡Repasemos!
  • ¡A practicar! Registra las excepciones

  • Qué datos añadir en los eventos
  • Caso de uso compartido: Autenticación y autorización
  • Relación entre módulos User y Auth

  • 🤭 Errores comunes
  • 👮‍ Logging y Monitoring
  • 🚀 Planteamiento pipeline del deploy a producción
  • 🚶‍ Conclusión y siguientes pasos
  • 💬 Feedback de mejora del curso y siguientes pasos
Ir al curso

Cursos relacionados

Standard
Patrones de diseño: Inbox y Outbox

📬 Patrones de diseño: Inbox y Outbox

Javier FerrerRafa Gómez

Aprende cuándo utilizar (y cuándo no) los patrones Inbox y Outbox.

Ver curso
Standard
Event bus en base de datos [Diseño de Infraestructura]

🚏 Event bus en base de datos [Diseño de Infraestructura]

Javier FerrerRafa Gómez

Añade escalabilidad utilizando tu propia base de datos como un Event Bus.

Ver curso
Standard
Auditoría Green Slope

🟢 Auditoría Green Slope

Javier FerrerRafa Gómez

Sesión de auditoría en la que revisamos el Diseño y Arquitectura de Software de Green Slope.

Ver curso
Ver catálogo completo

Paga según tus necesidades

lite (sólo mensual)

19 €
al mes
  • Cursos esenciales de programación para construir una base sólida
Popular

standard

24,92 €
Descuento vs mensual de 49 €
Pago anual de 299 €
al mes
  • Catálogo principal para dominar cómo escribir un código mantenible, escalable y testable
  • Recibir ofertas de empleo verificadas por Codely
  • Factura de empresa
  • Acumular descuentos al renovar

premium

41,58 €
Descuento vs mensual de 89 €
Pago anual de 499 €
al mes
  • Cursos exclusivos de IA para mantenerte siempre actualizado
  • Acceso anticipado a nuevos cursos
  • Descuento en workshops
  • Recibir ofertas de empleo verificadas por Codely
  • Factura de empresa
  • Acumular descuentos al renovar

No subiremos el precio mientras mantengas tu suscripción activa

SuscríbeteInicia sesión