Microservicio para la gestión de productos turísticos (servicios y paquetes) de la agencia de turismo Miramar.
Este proyecto forma parte del trabajo práctico de la Diplomatura FullStack y demuestra la implementación de un microservicio con dos arquitecturas diferentes:
- Arquitectura Tradicional (v1): Implementación clásica con Laravel siguiendo patrones MVC
- Arquitectura Hexagonal (v2): Implementación avanzada usando Ports & Adapters pattern
- PHP 8.1 o superior
- Composer
- MySQL 8.0 o superior
- Git
-
Clonar el repositorio
git clone https://github.com/isantander/miramar-productos.git cd miramar-productos -
Instalar dependencias
composer install
-
Configurar variables de entorno
cp .env.example .env
Editar
.envcon tus datos de base de datos:DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=miramar_productos DB_USERNAME=tu_usuario DB_PASSWORD=tu_password
-
Generar clave de aplicación
php artisan key:generate
-
Crear base de datos
CREATE DATABASE miramar_productos;
-
Ejecutar migraciones
php artisan migrate
-
Levantar servidor
php artisan serve
El proyecto estará disponible en: http://localhost:8000
Implementación siguiendo el patrón clásico de Laravel con separación en capas:
- Controllers: Manejan requests HTTP y coordinan respuestas
- Services: Contienen la lógica de negocio
- Models: Representan entidades de base de datos con Eloquent
- FormRequests: Validan datos de entrada
- Resources: Formatean respuestas JSON
Endpoints disponibles:
GET /api/servicios
POST /api/servicios
GET /api/servicios/{id}
PUT /api/servicios/{id}
DELETE /api/servicios/{id}
GET /api/paquetes
POST /api/paquetes
GET /api/paquetes/{id}
PUT /api/paquetes/{id}
DELETE /api/paquetes/{id}
Implementación avanzada siguiendo el patrón Ports & Adapters para demostrar:
- Independencia de framework: La lógica de negocio no depende de Laravel
- Testabilidad: Cada capa se puede probar independientemente
- Flexibilidad: Fácil intercambio de tecnologías (BD, APIs, etc.)
Estructura hexagonal:
app/
├── Domain/ # Núcleo del negocio
│ ├── Entities/ # Objetos de dominio puros
│ ├── Services/ # Lógica de negocio
│ └── Ports/ # Interfaces (contratos)
├── Application/ # Casos de uso
│ ├── UseCases/ # Orquestadores de flujo
│ └── DTOs/ # Objetos de transferencia
└── Infrastructure/ # Adaptadores externos
├── Http/ # Adaptador web (controllers, requests)
└── Repositories/ # Adaptador de base de datos
Endpoints V2:
GET /api/v2/servicios
POST /api/v2/servicios
GET /api/v2/servicios/{id}
PUT /api/v2/servicios/{id}
DELETE /api/v2/servicios/{id}
POST /api/servicios
Content-Type: application/json
{
"codigo_servicio": "SRV-001",
"nombre": "Tour Bariloche",
"descripcion": "Tour completo por Bariloche",
"destino": "Bariloche",
"fecha": "2024-12-25",
"precio": 1500.50
}POST /api/paquetes
Content-Type: application/json
{
"servicios": [1, 2, 3]
}├── app/
│ ├── Domain/ # Arquitectura hexagonal
│ ├── Application/ # Casos de uso
│ ├── Infrastructure/ # Adaptadores
│ ├── Http/Controllers/ # Controllers tradicionales
│ ├── Models/ # Modelos Eloquent
│ └── Services/ # Services tradicionales
├── database/
│ └── migrations/ # Esquema de base de datos
├── routes/
│ └── api.php # Definición de rutas
└── README.md
- Framework: Laravel 11
- Base de Datos: MySQL 8.0
- Lenguaje: PHP 8.1
- Arquitectura: MVC tradicional + Hexagonal
- Validaciones: FormRequests
- API: RESTful
- Documentación: Markdown
- Soft Deletes: Para mantener integridad referencial
- Foreign Keys con RESTRICT: Mayor seguridad ante eliminaciones accidentales
- Índices: En campos de búsqueda frecuente
- FormRequests separados:
StoreRequestyUpdateRequestpara mayor flexibilidad - Validación de arrays: Para servicios en paquetes
- Reglas de negocio: Mínimo 2 servicios por paquete
- Entities: Sin dependencias externas, solo lógica de dominio
- Ports: Interfaces que definen contratos
- Adapters: Implementaciones específicas (Eloquent, HTTP)
Este proyecto es parte de un trabajo práctico académico. Para consultas:
- Estudiante: Ivan Santander
- Institución: Diplomatura FullStack - Fundación COLSECOR
- Fecha: Julio 2024
Proyecto académico - Uso educativo únicamente.