fix(structure): Correct case-sensitivity for Linux compatibility
Rename folders to match PHP PSR-4 autoloading conventions: - schemas → Schemas - shared → Shared - Wordpress → WordPress (in all locations) Fixes deployment issues on Linux servers where filesystem is case-sensitive. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
0
Shared/Domain/Contracts/.gitkeep
Normal file
0
Shared/Domain/Contracts/.gitkeep
Normal file
11
Shared/Domain/Contracts/AjaxControllerInterface.php
Normal file
11
Shared/Domain/Contracts/AjaxControllerInterface.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
/**
|
||||
* Interface para controlador AJAX
|
||||
*/
|
||||
interface AjaxControllerInterface {
|
||||
// Se implementará completamente en Fase 5
|
||||
}
|
||||
61
Shared/Domain/Contracts/CSSGeneratorInterface.php
Normal file
61
Shared/Domain/Contracts/CSSGeneratorInterface.php
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
/**
|
||||
* Interface CSSGeneratorInterface
|
||||
*
|
||||
* Contrato para servicios que generan CSS a partir de configuraciones de componentes.
|
||||
* Define el comportamiento esperado para la generación de reglas CSS sin depender
|
||||
* de implementaciones específicas o frameworks.
|
||||
*
|
||||
* Responsabilidades:
|
||||
* - Generar CSS válido a partir de un selector y estilos
|
||||
* - Formatear reglas CSS correctamente
|
||||
* - Convertir nombres de propiedades (snake_case → kebab-case)
|
||||
*
|
||||
* NO responsable de:
|
||||
* - Media queries (manejado por Renderer con clases Bootstrap)
|
||||
* - Visibilidad responsive (manejado por Renderer)
|
||||
* - Persistencia o caché de CSS
|
||||
*
|
||||
* @package ROITheme\Shared\Domain\Contracts
|
||||
*/
|
||||
interface CSSGeneratorInterface
|
||||
{
|
||||
/**
|
||||
* Genera una regla CSS completa a partir de un selector y sus estilos.
|
||||
*
|
||||
* Convierte un array de estilos en una regla CSS válida y formateada.
|
||||
* Los nombres de propiedades en snake_case se convierten automáticamente
|
||||
* a kebab-case según el estándar CSS.
|
||||
*
|
||||
* Ejemplo:
|
||||
* ```php
|
||||
* $styles = [
|
||||
* 'background_color' => '#FF8600',
|
||||
* 'text_color' => '#FFFFFF',
|
||||
* 'font_size' => '1rem',
|
||||
* 'padding' => '1rem 0'
|
||||
* ];
|
||||
*
|
||||
* $css = $generator->generate('.navbar', $styles);
|
||||
*
|
||||
* // Resultado:
|
||||
* // .navbar {
|
||||
* // background-color: #FF8600;
|
||||
* // color: #FFFFFF;
|
||||
* // font-size: 1rem;
|
||||
* // padding: 1rem 0;
|
||||
* // }
|
||||
* ```
|
||||
*
|
||||
* @param string $selector Selector CSS (ej: '.navbar', '#header', 'body')
|
||||
* @param array<string, string> $styles Array asociativo de propiedades CSS y sus valores
|
||||
* Formato: ['property_name' => 'value']
|
||||
*
|
||||
* @return string Regla CSS completa y formateada, o string vacío si no hay estilos
|
||||
*/
|
||||
public function generate(string $selector, array $styles): string;
|
||||
}
|
||||
11
Shared/Domain/Contracts/CacheServiceInterface.php
Normal file
11
Shared/Domain/Contracts/CacheServiceInterface.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
/**
|
||||
* Interface para servicio de cache
|
||||
*/
|
||||
interface CacheServiceInterface {
|
||||
// Se implementará completamente en Fase 5
|
||||
}
|
||||
11
Shared/Domain/Contracts/CleanupServiceInterface.php
Normal file
11
Shared/Domain/Contracts/CleanupServiceInterface.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
/**
|
||||
* Interface para servicio de limpieza
|
||||
*/
|
||||
interface CleanupServiceInterface {
|
||||
// Se implementará completamente en Fase 5
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
use ROITheme\Shared\Domain\Entities\Component;
|
||||
use ROITheme\Shared\Domain\ValueObjects\ComponentName;
|
||||
use ROITheme\Shared\Domain\ValueObjects\ComponentConfiguration;
|
||||
|
||||
/**
|
||||
* ComponentDefaultsRepositoryInterface - Contrato para valores por defecto de componentes
|
||||
*
|
||||
* RESPONSABILIDAD: Definir contrato para gestión de configuración por defecto de componentes
|
||||
*
|
||||
* PROPÓSITO:
|
||||
* - Almacenar configuración "factory" de cada tipo de componente
|
||||
* - Permitir resetear componentes a valores por defecto
|
||||
* - Proporcionar plantillas para nuevos componentes
|
||||
*
|
||||
* CASO DE USO:
|
||||
* ```php
|
||||
* // Crear nuevo componente top_bar con valores por defecto
|
||||
* $defaults = $defaultsRepo->getByName(ComponentName::fromString('top_bar'));
|
||||
* $component = new Component(
|
||||
* ComponentName::fromString('top_bar'),
|
||||
* $defaults // configuración por defecto
|
||||
* );
|
||||
*
|
||||
* // Resetear componente a valores por defecto
|
||||
* $component = $component->updateConfiguration($defaults);
|
||||
* ```
|
||||
*
|
||||
* @package ROITheme\Shared\Domain\Contracts
|
||||
*/
|
||||
interface ComponentDefaultsRepositoryInterface
|
||||
{
|
||||
/**
|
||||
* Obtener configuración por defecto de un componente
|
||||
*
|
||||
* @param ComponentName $name Nombre del componente
|
||||
* @return ComponentConfiguration Configuración por defecto
|
||||
*/
|
||||
public function getByName(ComponentName $name): ComponentConfiguration;
|
||||
|
||||
/**
|
||||
* Guardar configuración por defecto para un componente
|
||||
*
|
||||
* @param ComponentName $name Nombre del componente
|
||||
* @param ComponentConfiguration $configuration Configuración por defecto
|
||||
* @return void
|
||||
*/
|
||||
public function save(ComponentName $name, ComponentConfiguration $configuration): void;
|
||||
|
||||
/**
|
||||
* Verificar si existen defaults para un componente
|
||||
*
|
||||
* @param ComponentName $name
|
||||
* @return bool
|
||||
*/
|
||||
public function exists(ComponentName $name): bool;
|
||||
|
||||
/**
|
||||
* Obtener todos los defaults
|
||||
*
|
||||
* @return array<string, ComponentConfiguration> Array asociativo nombre => configuración
|
||||
*/
|
||||
public function findAll(): array;
|
||||
|
||||
/**
|
||||
* Eliminar defaults de un componente
|
||||
*
|
||||
* @param ComponentName $name
|
||||
* @return bool True si se eliminó, false si no existía
|
||||
*/
|
||||
public function delete(ComponentName $name): bool;
|
||||
}
|
||||
11
Shared/Domain/Contracts/ComponentManagerInterface.php
Normal file
11
Shared/Domain/Contracts/ComponentManagerInterface.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
/**
|
||||
* Interface para facade ComponentManager
|
||||
*/
|
||||
interface ComponentManagerInterface {
|
||||
// Se implementará completamente en Fase 5
|
||||
}
|
||||
124
Shared/Domain/Contracts/ComponentRepositoryInterface.php
Normal file
124
Shared/Domain/Contracts/ComponentRepositoryInterface.php
Normal file
@@ -0,0 +1,124 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
use ROITheme\Shared\Domain\Entities\Component;
|
||||
use ROITheme\Shared\Domain\ValueObjects\ComponentName;
|
||||
use ROITheme\Shared\Domain\Exceptions\ComponentNotFoundException;
|
||||
|
||||
/**
|
||||
* ComponentRepositoryInterface - Contrato para persistencia de componentes
|
||||
*
|
||||
* RESPONSABILIDAD: Definir contrato para operaciones CRUD de componentes
|
||||
*
|
||||
* INVERSIÓN DE DEPENDENCIAS:
|
||||
* - Esta interfaz está en Domain (núcleo)
|
||||
* - Infrastructure implementa esta interfaz
|
||||
* - Application depende de esta interfaz (NO de la implementación)
|
||||
*
|
||||
* IMPLEMENTACIONES ESPERADAS:
|
||||
* - WordPressComponentRepository (usa wpdb y tablas WP)
|
||||
* - InMemoryComponentRepository (para testing)
|
||||
* - FileSystemComponentRepository (futuro: archivos JSON)
|
||||
*
|
||||
* PRINCIPIOS:
|
||||
* - Métodos retornan entidades de dominio (Component)
|
||||
* - Parámetros son Value Objects o primitivos
|
||||
* - Excepciones son de dominio
|
||||
* - Sin conocimiento de WordPress/BD
|
||||
*
|
||||
* USO:
|
||||
* ```php
|
||||
* // En Application Layer
|
||||
* class SaveComponentUseCase {
|
||||
* public function __construct(
|
||||
* private ComponentRepositoryInterface $repository
|
||||
* ) {}
|
||||
*
|
||||
* public function execute(SaveComponentRequest $request): void {
|
||||
* $component = new Component(...);
|
||||
* $this->repository->save($component);
|
||||
* }
|
||||
* }
|
||||
* ```
|
||||
*
|
||||
* @package ROITheme\Shared\Domain\Contracts
|
||||
*/
|
||||
interface ComponentRepositoryInterface
|
||||
{
|
||||
/**
|
||||
* Guardar o actualizar un componente
|
||||
*
|
||||
* Si el componente ya existe (por nombre), se actualiza.
|
||||
* Si no existe, se crea.
|
||||
*
|
||||
* @param Component $component Componente a guardar
|
||||
* @return Component Componente guardado (con timestamps actualizados)
|
||||
*/
|
||||
public function save(Component $component): Component;
|
||||
|
||||
/**
|
||||
* Buscar componente por nombre
|
||||
*
|
||||
* @param ComponentName $name Nombre del componente
|
||||
* @return Component|null Componente encontrado o null
|
||||
*/
|
||||
public function findByName(ComponentName $name): ?Component;
|
||||
|
||||
/**
|
||||
* Obtener componente por nombre (lanza excepción si no existe)
|
||||
*
|
||||
* @param ComponentName $name
|
||||
* @return Component
|
||||
* @throws ComponentNotFoundException
|
||||
*/
|
||||
public function getByName(ComponentName $name): Component;
|
||||
|
||||
/**
|
||||
* Obtener todos los componentes
|
||||
*
|
||||
* @return Component[] Array de componentes
|
||||
*/
|
||||
public function findAll(): array;
|
||||
|
||||
/**
|
||||
* Obtener componentes habilitados
|
||||
*
|
||||
* @return Component[] Array de componentes habilitados
|
||||
*/
|
||||
public function findEnabled(): array;
|
||||
|
||||
/**
|
||||
* Verificar si existe un componente con el nombre dado
|
||||
*
|
||||
* @param ComponentName $name
|
||||
* @return bool
|
||||
*/
|
||||
public function exists(ComponentName $name): bool;
|
||||
|
||||
/**
|
||||
* Eliminar un componente
|
||||
*
|
||||
* @param ComponentName $name Nombre del componente a eliminar
|
||||
* @return bool True si se eliminó, false si no existía
|
||||
*/
|
||||
public function delete(ComponentName $name): bool;
|
||||
|
||||
/**
|
||||
* Obtener cantidad total de componentes
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function count(): int;
|
||||
|
||||
/**
|
||||
* Obtener componentes por grupo de configuración
|
||||
*
|
||||
* Ejemplo: Obtener todos los componentes que tienen configuración de 'content'
|
||||
*
|
||||
* @param string $group Grupo de configuración (visibility, content, styles, general)
|
||||
* @return Component[]
|
||||
*/
|
||||
public function findByConfigGroup(string $group): array;
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
/**
|
||||
* Interface para el repositorio de configuraciones de componentes
|
||||
*
|
||||
* Domain Layer - Define el contrato para acceso a datos de configuraci<63>n
|
||||
* Trabaja con la tabla wp_roi_theme_component_settings (normalizada)
|
||||
*
|
||||
* Esta interfaz es gen<65>rica y funciona para todos los componentes del tema.
|
||||
*
|
||||
* @package ROITheme\Shared\Domain\Contracts
|
||||
*/
|
||||
interface ComponentSettingsRepositoryInterface
|
||||
{
|
||||
/**
|
||||
* Obtiene todas las configuraciones de un componente agrupadas por grupo
|
||||
*
|
||||
* @param string $componentName Nombre del componente (ej: 'top-notification-bar')
|
||||
* @return array<string, array<string, mixed>> Configuraciones agrupadas
|
||||
* Ejemplo: [
|
||||
* 'visibility' => ['enabled' => true, 'show_on_mobile' => true, ...],
|
||||
* 'content' => ['icon_class' => 'bi-star', 'label_text' => 'Nuevo', ...],
|
||||
* 'styles' => ['background_color' => '#0E2337', ...]
|
||||
* ]
|
||||
*/
|
||||
public function getComponentSettings(string $componentName): array;
|
||||
|
||||
/**
|
||||
* Guarda las configuraciones de un componente
|
||||
*
|
||||
* @param string $componentName Nombre del componente
|
||||
* @param array<string, array<string, mixed>> $settings Configuraciones agrupadas
|
||||
* Ejemplo: [
|
||||
* 'visibility' => ['enabled' => true],
|
||||
* 'content' => ['icon_class' => 'bi-star']
|
||||
* ]
|
||||
* @return int N<>mero de campos actualizados
|
||||
*/
|
||||
public function saveComponentSettings(string $componentName, array $settings): int;
|
||||
|
||||
/**
|
||||
* Obtiene el valor de un campo espec<65>fico
|
||||
*
|
||||
* @param string $componentName Nombre del componente
|
||||
* @param string $groupName Nombre del grupo
|
||||
* @param string $attributeName Nombre del atributo
|
||||
* @return mixed|null Valor del campo o null si no existe
|
||||
*/
|
||||
public function getFieldValue(string $componentName, string $groupName, string $attributeName): mixed;
|
||||
|
||||
/**
|
||||
* Guarda el valor de un campo espec<65>fico
|
||||
*
|
||||
* @param string $componentName Nombre del componente
|
||||
* @param string $groupName Nombre del grupo
|
||||
* @param string $attributeName Nombre del atributo
|
||||
* @param mixed $value Valor a guardar
|
||||
* @return bool True si se guard<72> correctamente
|
||||
*/
|
||||
public function saveFieldValue(string $componentName, string $groupName, string $attributeName, mixed $value): bool;
|
||||
|
||||
/**
|
||||
* Restaura un componente a sus valores por defecto desde el schema JSON
|
||||
*
|
||||
* @param string $componentName Nombre del componente
|
||||
* @param string $schemaPath Ruta al archivo schema JSON
|
||||
* @return int N<>mero de campos restaurados
|
||||
*/
|
||||
public function resetToDefaults(string $componentName, string $schemaPath): int;
|
||||
}
|
||||
11
Shared/Domain/Contracts/ConfigurationServiceInterface.php
Normal file
11
Shared/Domain/Contracts/ConfigurationServiceInterface.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
/**
|
||||
* Interface para servicio de configuración
|
||||
*/
|
||||
interface ConfigurationServiceInterface {
|
||||
// Se implementará completamente en Fase 5
|
||||
}
|
||||
11
Shared/Domain/Contracts/DefaultRepositoryInterface.php
Normal file
11
Shared/Domain/Contracts/DefaultRepositoryInterface.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
/**
|
||||
* Interface para repositorio de defaults
|
||||
*/
|
||||
interface DefaultRepositoryInterface {
|
||||
// Se implementará completamente en Fase 5
|
||||
}
|
||||
55
Shared/Domain/Contracts/RendererInterface.php
Normal file
55
Shared/Domain/Contracts/RendererInterface.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
use ROITheme\Shared\Domain\Entities\Component;
|
||||
|
||||
/**
|
||||
* RendererInterface - Contrato para renderizadores de componentes
|
||||
*
|
||||
* RESPONSABILIDAD: Definir el contrato que deben cumplir todos los renderizadores
|
||||
* de componentes para generar HTML a partir de los datos del componente.
|
||||
*
|
||||
* PRINCIPIOS:
|
||||
* - Interface Segregation: Una sola responsabilidad - renderizar HTML
|
||||
* - Dependency Inversion: Depender de abstracción, no de implementación
|
||||
*
|
||||
* USO:
|
||||
* ```php
|
||||
* final class MyRenderer implements RendererInterface
|
||||
* {
|
||||
* public function render(Component $component): string
|
||||
* {
|
||||
* $data = $component->getData();
|
||||
* // Generar HTML
|
||||
* return $html;
|
||||
* }
|
||||
*
|
||||
* public function supports(string $componentType): bool
|
||||
* {
|
||||
* return $componentType === 'my-component';
|
||||
* }
|
||||
* }
|
||||
* ```
|
||||
*
|
||||
* @package ROITheme\Domain\Component
|
||||
*/
|
||||
interface RendererInterface
|
||||
{
|
||||
/**
|
||||
* Renderizar un componente a HTML
|
||||
*
|
||||
* @param Component $component Componente a renderizar
|
||||
* @return string HTML generado
|
||||
*/
|
||||
public function render(Component $component): string;
|
||||
|
||||
/**
|
||||
* Verificar si este renderizador soporta un tipo de componente
|
||||
*
|
||||
* @param string $componentType Tipo de componente (ej: 'navbar', 'footer')
|
||||
* @return bool True si soporta el tipo, false en caso contrario
|
||||
*/
|
||||
public function supports(string $componentType): bool;
|
||||
}
|
||||
11
Shared/Domain/Contracts/SchemaSyncServiceInterface.php
Normal file
11
Shared/Domain/Contracts/SchemaSyncServiceInterface.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
/**
|
||||
* Interface para servicio de sincronización de schemas
|
||||
*/
|
||||
interface SchemaSyncServiceInterface {
|
||||
// Se implementará completamente en Fase 5
|
||||
}
|
||||
11
Shared/Domain/Contracts/TransactionManagerInterface.php
Normal file
11
Shared/Domain/Contracts/TransactionManagerInterface.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
/**
|
||||
* Interface para gestión de transacciones de base de datos
|
||||
*/
|
||||
interface TransactionManagerInterface {
|
||||
// Se implementará completamente en Fase 5
|
||||
}
|
||||
199
Shared/Domain/Contracts/ValidationServiceInterface.php
Normal file
199
Shared/Domain/Contracts/ValidationServiceInterface.php
Normal file
@@ -0,0 +1,199 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace ROITheme\Shared\Domain\Contracts;
|
||||
|
||||
/**
|
||||
* ValidationServiceInterface - Contrato para servicio de validación
|
||||
*
|
||||
* RESPONSABILIDAD: Definir contrato para validación de datos de entrada
|
||||
*
|
||||
* PROPÓSITO:
|
||||
* - Validar datos antes de crear entidades de dominio
|
||||
* - Sanitizar entrada del usuario
|
||||
* - Retornar errores de validación estructurados
|
||||
*
|
||||
* UBICACIÓN EN ARQUITECTURA:
|
||||
* - Interfaz definida en Domain
|
||||
* - Implementación en Infrastructure (puede usar WordPress functions)
|
||||
* - Usado por Application Layer (Use Cases)
|
||||
*
|
||||
* IMPLEMENTACIONES ESPERADAS:
|
||||
* - WordPressValidationService (usa sanitize_*, wp_kses, etc.)
|
||||
* - StrictValidationService (validación más estricta para prod)
|
||||
* - LenientValidationService (validación más permisiva para dev)
|
||||
*
|
||||
* USO:
|
||||
* ```php
|
||||
* // En Application Layer
|
||||
* class SaveComponentUseCase {
|
||||
* public function __construct(
|
||||
* private ValidationServiceInterface $validator
|
||||
* ) {}
|
||||
*
|
||||
* public function execute(SaveComponentRequest $request): void {
|
||||
* $result = $this->validator->validate(
|
||||
* $request->getData(),
|
||||
* $request->getComponentName()
|
||||
* );
|
||||
*
|
||||
* if (!$result->isValid()) {
|
||||
* throw new ValidationException($result->getErrors());
|
||||
* }
|
||||
*
|
||||
* // ... crear componente con datos validados
|
||||
* }
|
||||
* }
|
||||
* ```
|
||||
*
|
||||
* @package ROITheme\Shared\Domain\Contracts
|
||||
*/
|
||||
interface ValidationServiceInterface
|
||||
{
|
||||
/**
|
||||
* Validar datos de un componente
|
||||
*
|
||||
* @param array $data Datos a validar
|
||||
* @param string $componentName Nombre del componente (para reglas específicas)
|
||||
* @return ValidationResult Resultado de validación
|
||||
*/
|
||||
public function validate(array $data, string $componentName): ValidationResult;
|
||||
|
||||
/**
|
||||
* Sanitizar datos de entrada
|
||||
*
|
||||
* @param array $data Datos a sanitizar
|
||||
* @param string $componentName Nombre del componente
|
||||
* @return array Datos sanitizados
|
||||
*/
|
||||
public function sanitize(array $data, string $componentName): array;
|
||||
|
||||
/**
|
||||
* Validar una URL
|
||||
*
|
||||
* @param string $url URL a validar
|
||||
* @return bool
|
||||
*/
|
||||
public function isValidUrl(string $url): bool;
|
||||
|
||||
/**
|
||||
* Validar un color hexadecimal
|
||||
*
|
||||
* @param string $color Color a validar (ej: #000000)
|
||||
* @return bool
|
||||
*/
|
||||
public function isValidColor(string $color): bool;
|
||||
|
||||
/**
|
||||
* Validar nombre de componente
|
||||
*
|
||||
* @param string $name Nombre a validar
|
||||
* @return bool
|
||||
*/
|
||||
public function isValidComponentName(string $name): bool;
|
||||
}
|
||||
|
||||
/**
|
||||
* ValidationResult - Value Object para resultado de validación
|
||||
*
|
||||
* RESPONSABILIDAD: Encapsular resultado de una validación
|
||||
*
|
||||
* @package ROITheme\Shared\Domain\Contracts
|
||||
*/
|
||||
final readonly class ValidationResult
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param bool $isValid Si la validación pasó
|
||||
* @param array $errors Array de errores (campo => mensaje)
|
||||
* @param array $sanitizedData Datos sanitizados
|
||||
*/
|
||||
public function __construct(
|
||||
private bool $isValid,
|
||||
private array $errors = [],
|
||||
private array $sanitizedData = []
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Verificar si la validación pasó
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isValid(): bool
|
||||
{
|
||||
return $this->isValid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtener errores de validación
|
||||
*
|
||||
* @return array Array asociativo campo => mensaje
|
||||
*/
|
||||
public function getErrors(): array
|
||||
{
|
||||
return $this->errors;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtener datos sanitizados
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getSanitizedData(): array
|
||||
{
|
||||
return $this->sanitizedData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verificar si hay error en campo específico
|
||||
*
|
||||
* @param string $field
|
||||
* @return bool
|
||||
*/
|
||||
public function hasError(string $field): bool
|
||||
{
|
||||
return isset($this->errors[$field]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtener error de un campo específico
|
||||
*
|
||||
* @param string $field
|
||||
* @return string|null
|
||||
*/
|
||||
public function getError(string $field): ?string
|
||||
{
|
||||
return $this->errors[$field] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Factory: Resultado exitoso
|
||||
*
|
||||
* @param array $sanitizedData
|
||||
* @return self
|
||||
*/
|
||||
public static function success(array $sanitizedData): self
|
||||
{
|
||||
return new self(
|
||||
isValid: true,
|
||||
errors: [],
|
||||
sanitizedData: $sanitizedData
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Factory: Resultado con errores
|
||||
*
|
||||
* @param array $errors
|
||||
* @return self
|
||||
*/
|
||||
public static function failure(array $errors): self
|
||||
{
|
||||
return new self(
|
||||
isValid: false,
|
||||
errors: $errors,
|
||||
sanitizedData: []
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user