Migración completa a Clean Architecture con componentes funcionales
- Reorganización de estructura: Admin/, Public/, Shared/, Schemas/ - 12 componentes migrados: TopNotificationBar, Navbar, CtaLetsTalk, Hero, FeaturedImage, TableOfContents, CtaBoxSidebar, SocialShare, CtaPost, RelatedPost, ContactForm, Footer - Panel de administración con tabs Bootstrap 5 funcionales - Schemas JSON para configuración de componentes - Renderers dinámicos con CSSGeneratorService (cero CSS hardcodeado) - FormBuilders para UI admin con Design System consistente - Fix: Bootstrap JS cargado en header para tabs funcionales - Fix: buildTextInput maneja valores mixed (bool/string) - Eliminación de estructura legacy (src/, admin/, assets/css/componente-*) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,217 +1,133 @@
|
||||
# Capa de Infraestructura - Shared (Implementaciones Concretas)
|
||||
# Capa de Infraestructura
|
||||
|
||||
## Propósito
|
||||
## 📋 Propósito
|
||||
|
||||
La capa de Infraestructura de `shared/` contiene **implementaciones concretas** de los servicios definidos en
|
||||
Application, utilizando WordPress y otras librerías externas.
|
||||
La **Capa de Infraestructura** contiene las implementaciones concretas de las interfaces definidas en el Dominio. Conecta la lógica de negocio con el mundo exterior (WordPress, MySQL, cache, HTTP).
|
||||
|
||||
## Principios
|
||||
## 🎯 Responsabilidades
|
||||
|
||||
1. **Implementaciones concretas**: Código que interactúa con WordPress y librerías
|
||||
2. **Cumple contratos**: Implementa las interfaces definidas en Application
|
||||
3. **Detalles técnicos**: Maneja aspectos técnicos como caché, base de datos, APIs
|
||||
4. **Reusabilidad**: Servicios compartidos por todos los contextos
|
||||
- ✅ Implementar interfaces del Dominio
|
||||
- ✅ Conectar con frameworks (WordPress)
|
||||
- ✅ Persistencia (MySQL via wpdb)
|
||||
- ✅ Cache (WordPress Transients)
|
||||
- ✅ HTTP (AJAX endpoints)
|
||||
- ✅ Contiene detalles de implementación
|
||||
|
||||
## Estructura
|
||||
## 📦 Estructura
|
||||
|
||||
```
|
||||
shared/Infrastructure/
|
||||
├── Services/ # Implementaciones de servicios (WordPressCacheService, etc.)
|
||||
└── Traits/ # Traits reutilizables (WordPress helpers, etc.)
|
||||
Infrastructure/
|
||||
├── Persistence/
|
||||
│ └── WordPress/
|
||||
│ ├── WordPressComponentRepository.php (MySQL)
|
||||
│ └── WordPressDefaultsRepository.php (Schemas)
|
||||
├── Services/
|
||||
│ ├── WordPressValidationService.php (Validación)
|
||||
│ ├── WordPressCacheService.php (Transients)
|
||||
│ ├── SchemaSyncService.php (JSON → BD)
|
||||
│ └── CleanupService.php (Limpieza)
|
||||
├── API/
|
||||
│ └── WordPress/
|
||||
│ └── AjaxController.php (Endpoints AJAX)
|
||||
├── Facades/
|
||||
│ └── ComponentManager.php (API unificada)
|
||||
├── DI/
|
||||
│ └── DIContainer.php (Dependency Injection)
|
||||
└── README.md
|
||||
```
|
||||
|
||||
## Ejemplos de Uso
|
||||
## 🔌 Implementaciones
|
||||
|
||||
### Services (Implementaciones Concretas)
|
||||
### Repositories
|
||||
|
||||
Implementación de CacheService usando WordPress Transients:
|
||||
#### WordPressComponentRepository
|
||||
Persiste componentes en `wp_roi_theme_components`.
|
||||
|
||||
**Métodos**:
|
||||
- `save(Component)`: INSERT o UPDATE
|
||||
- `findByName(string)`: Buscar por nombre
|
||||
- `findAll()`: Obtener todos
|
||||
- `delete(string)`: Eliminar
|
||||
|
||||
#### WordPressDefaultsRepository
|
||||
Gestiona schemas en `wp_roi_theme_defaults`.
|
||||
|
||||
### Services
|
||||
|
||||
#### WordPressValidationService
|
||||
Valida datos contra schemas.
|
||||
|
||||
**Estrategia**:
|
||||
1. Obtener schema de BD
|
||||
2. Validar estructura
|
||||
3. Sanitizar con funciones WordPress
|
||||
|
||||
#### WordPressCacheService
|
||||
Cache con WordPress Transients API.
|
||||
|
||||
**TTL default**: 1 hora (3600 segundos)
|
||||
|
||||
#### SchemaSyncService
|
||||
Sincroniza schemas desde JSON a BD.
|
||||
|
||||
#### CleanupService
|
||||
Elimina componentes obsoletos.
|
||||
|
||||
### API
|
||||
|
||||
#### AjaxController
|
||||
Endpoints AJAX de WordPress.
|
||||
|
||||
**Endpoints disponibles**:
|
||||
- `roi_theme_save_component` (POST)
|
||||
- `roi_theme_get_component` (GET)
|
||||
- `roi_theme_delete_component` (POST)
|
||||
- `roi_theme_sync_schema` (POST)
|
||||
|
||||
**Seguridad**:
|
||||
- Nonce verification
|
||||
- Capability check (manage_options)
|
||||
|
||||
### Facade
|
||||
|
||||
#### ComponentManager
|
||||
API unificada para todo el sistema.
|
||||
|
||||
**Uso**:
|
||||
```php
|
||||
$manager = new ComponentManager($container);
|
||||
$result = $manager->saveComponent('top_bar', $data);
|
||||
```
|
||||
|
||||
## 📐 Principios Arquitectónicos
|
||||
|
||||
### Dependency Inversion
|
||||
|
||||
Infrastructure implementa interfaces del Domain:
|
||||
|
||||
```php
|
||||
namespace ROITheme\Shared\Infrastructure\Services;
|
||||
|
||||
use ROITheme\Shared\Application\Contracts\CacheServiceInterface;
|
||||
|
||||
final class WordPressCacheService implements CacheServiceInterface
|
||||
class WordPressComponentRepository implements ComponentRepositoryInterface
|
||||
{
|
||||
public function get(string $key): mixed
|
||||
{
|
||||
return get_transient($this->prefixKey($key));
|
||||
}
|
||||
|
||||
public function set(string $key, mixed $value, int $ttl = 3600): bool
|
||||
{
|
||||
return set_transient($this->prefixKey($key), $value, $ttl);
|
||||
}
|
||||
|
||||
public function delete(string $key): bool
|
||||
{
|
||||
return delete_transient($this->prefixKey($key));
|
||||
}
|
||||
|
||||
public function flush(): bool
|
||||
{
|
||||
return wp_cache_flush();
|
||||
}
|
||||
|
||||
private function prefixKey(string $key): string
|
||||
{
|
||||
return 'roi_theme_' . $key;
|
||||
}
|
||||
// Implementación específica de WordPress
|
||||
}
|
||||
```
|
||||
|
||||
Implementación de ValidationService usando WordPress Sanitization:
|
||||
### Separación de Concerns
|
||||
|
||||
```php
|
||||
namespace ROITheme\Shared\Infrastructure\Services;
|
||||
- **Repositories**: Solo persistencia
|
||||
- **Services**: Lógica de infraestructura
|
||||
- **Controller**: Solo HTTP
|
||||
- **Facade**: Orquestación simple
|
||||
|
||||
use ROITheme\Shared\Application\Services\BaseValidationService;
|
||||
## 🧪 Testing
|
||||
|
||||
final class WordPressValidationService extends BaseValidationService
|
||||
{
|
||||
public function validate(array $data, array $rules): array
|
||||
{
|
||||
$validated = [];
|
||||
Tests de **integración** (usan BD real de WordPress):
|
||||
|
||||
foreach ($rules as $field => $rule) {
|
||||
if (!isset($data[$field])) {
|
||||
$this->errors[$field] = "Field {$field} is required";
|
||||
continue;
|
||||
}
|
||||
|
||||
$validated[$field] = match($rule) {
|
||||
'email' => sanitize_email($data[$field]),
|
||||
'text' => sanitize_text_field($data[$field]),
|
||||
'int' => intval($data[$field]),
|
||||
'url' => esc_url_raw($data[$field]),
|
||||
default => $data[$field]
|
||||
};
|
||||
}
|
||||
|
||||
return $validated;
|
||||
}
|
||||
}
|
||||
```bash
|
||||
vendor\bin\phpunit tests\Integration\Infrastructure
|
||||
```
|
||||
|
||||
### Traits (Helpers Reutilizables)
|
||||
## 🔗 Referencias
|
||||
|
||||
Traits para funcionalidad común de WordPress:
|
||||
|
||||
```php
|
||||
namespace ROITheme\Shared\Infrastructure\Traits;
|
||||
|
||||
trait WordPressMetaDataTrait
|
||||
{
|
||||
private function getMeta(int $postId, string $key, bool $single = true): mixed
|
||||
{
|
||||
return get_post_meta($postId, $this->prefixMetaKey($key), $single);
|
||||
}
|
||||
|
||||
private function updateMeta(int $postId, string $key, mixed $value): bool
|
||||
{
|
||||
return update_post_meta($postId, $this->prefixMetaKey($key), $value);
|
||||
}
|
||||
|
||||
private function deleteMeta(int $postId, string $key): bool
|
||||
{
|
||||
return delete_post_meta($postId, $this->prefixMetaKey($key));
|
||||
}
|
||||
|
||||
private function prefixMetaKey(string $key): string
|
||||
{
|
||||
return '_roi_' . $key;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Relación con Application
|
||||
|
||||
La capa Infrastructure **implementa** los contratos definidos en Application:
|
||||
|
||||
```
|
||||
shared/Application/Contracts/CacheServiceInterface.php (interface)
|
||||
↓ implementa
|
||||
shared/Infrastructure/Services/WordPressCacheService.php (implementación)
|
||||
```
|
||||
|
||||
## Inyección de Dependencias
|
||||
|
||||
Los servicios se registran en el DI Container y se inyectan a través de constructores:
|
||||
|
||||
```php
|
||||
// En el DI Container (configuración)
|
||||
$container->bind(
|
||||
CacheServiceInterface::class,
|
||||
WordPressCacheService::class
|
||||
);
|
||||
|
||||
// En el código que usa el servicio
|
||||
public function __construct(
|
||||
private readonly CacheServiceInterface $cache
|
||||
) {}
|
||||
```
|
||||
|
||||
## Reglas de Dependencia
|
||||
|
||||
✅ **PUEDE** depender de:
|
||||
- `shared/Domain/` (Value Objects, Entities)
|
||||
- `shared/Application/` (especialmente Contracts)
|
||||
- WordPress functions
|
||||
- Librerías externas (Composer packages)
|
||||
|
||||
❌ **NO PUEDE** depender de:
|
||||
- `admin/` o `public/` (contextos específicos)
|
||||
|
||||
## Testing
|
||||
|
||||
Los servicios de Infrastructure se testean con **tests de integración** que usan WordPress:
|
||||
|
||||
```php
|
||||
// tests/Integration/Shared/Infrastructure/Services/WordPressCacheServiceTest.php
|
||||
public function test_stores_and_retrieves_from_cache()
|
||||
{
|
||||
$cache = new WordPressCacheService();
|
||||
|
||||
$cache->set('test_key', 'test_value', 3600);
|
||||
$result = $cache->get('test_key');
|
||||
|
||||
$this->assertEquals('test_value', $result);
|
||||
}
|
||||
```
|
||||
|
||||
## Cuándo Agregar Código Aquí
|
||||
|
||||
Agrega código a `shared/Infrastructure/` cuando:
|
||||
- Implementas un servicio definido en Application/Contracts/
|
||||
- Necesitas interactuar con WordPress (base de datos, caché, opciones, etc.)
|
||||
- Integras una librería externa
|
||||
- Creas utilidades de bajo nivel compartidas
|
||||
|
||||
No agregues aquí:
|
||||
- Lógica de negocio (va en Domain/)
|
||||
- Definiciones de interfaces (van en Application/Contracts/)
|
||||
- Código específico de admin o public
|
||||
- Código sin contrato (sin interface)
|
||||
|
||||
## Servicios Comunes en Infrastructure
|
||||
|
||||
### Services/
|
||||
- `WordPressCacheService`: Caché usando WordPress Transients
|
||||
- `WordPressValidationService`: Validación con WordPress sanitization
|
||||
- `WordPressLoggerService`: Logging usando error_log o debug.log
|
||||
- `WordPressDatabaseService`: Interacciones directas con $wpdb
|
||||
|
||||
### Traits/
|
||||
- `WordPressMetaDataTrait`: Helpers para post meta
|
||||
- `WordPressTaxonomyTrait`: Helpers para términos y taxonomías
|
||||
- `WordPressHooksTrait`: Helpers para actions y filters
|
||||
- `WordPressSanitizationTrait`: Helpers para sanitización
|
||||
|
||||
## Patrón de Diseño
|
||||
|
||||
Seguimos el patrón **Adapter**:
|
||||
- WordPress es el "adaptee" (sistema externo)
|
||||
- Nuestros Services son "adapters"
|
||||
- Los Contracts son las interfaces que queremos
|
||||
|
||||
Esto permite cambiar WordPress por otro sistema en el futuro sin afectar el código de negocio.
|
||||
- Domain Layer: `../Domain/README.md`
|
||||
- Application Layer: `../Application/README.md`
|
||||
|
||||
Reference in New Issue
Block a user