# Capa de Dominio - Shared (Fundación) ## Propósito La capa de Dominio de `shared/` contiene la **lógica de negocio compartida** que utilizan todos los contextos (admin y public). Es la fundación del proyecto y no debe tener dependencias de frameworks, librerías externas, o capas superiores. ## Principios 1. **Sin dependencias externas**: No depende de WordPress, plugins, o librerías 2. **Lógica pura**: Solo reglas de negocio y objetos de dominio 3. **Inmutabilidad**: Los Value Objects son inmutables 4. **Validación**: Los objetos se validan a sí mismos ## Estructura ``` shared/Domain/ ├── ValueObjects/ # Value Objects compartidos (ComponentID, SettingValue, etc.) ├── Exceptions/ # Excepciones de dominio (InvalidComponentException, etc.) └── Contracts/ # Interfaces de repositorios y servicios de dominio ``` ## Ejemplos de Uso ### Value Objects Value Objects que representan conceptos del dominio: ```php namespace ROITheme\Shared\Domain\ValueObjects; final class ComponentID { private int $value; public function __construct(int $value) { if ($value <= 0) { throw new \InvalidArgumentException('Component ID must be positive'); } $this->value = $value; } public function value(): int { return $this->value; } public function equals(ComponentID $other): bool { return $this->value === $other->value; } } ``` ### Excepciones Excepciones específicas del dominio: ```php namespace ROITheme\Shared\Domain\Exceptions; class InvalidComponentException extends \DomainException { public static function withId(int $id): self { return new self("Component with ID {$id} is invalid"); } } ``` ### Contracts (Interfaces) Interfaces que definen comportamientos: ```php namespace ROITheme\Shared\Domain\Contracts; interface ComponentRepositoryInterface { public function findById(ComponentID $id): ?Component; public function save(Component $component): void; } ``` ## Reglas de Dependencia ✅ **PUEDE** depender de: - Otros objetos dentro de `shared/Domain/` - SPL (Standard PHP Library) - Nada más ❌ **NO PUEDE** depender de: - `shared/Application/` - `shared/Infrastructure/` - `admin/` o `public/` - WordPress functions - Librerías externas ## Testing Los objetos de esta capa se testean con **tests unitarios puros**, sin necesidad de WordPress: ```php // tests/Unit/Shared/Domain/ValueObjects/ComponentIDTest.php public function test_creates_valid_component_id() { $id = new ComponentID(123); $this->assertEquals(123, $id->value()); } ``` ## Cuándo Agregar Código Aquí Agrega código a `shared/Domain/` cuando: - Es lógica de negocio pura (sin WordPress) - Es compartido por admin/ y public/ - Es un concepto fundamental del dominio - Necesita alta cohesión y bajo acoplamiento No agregues aquí: - Código que depende de WordPress - Lógica específica de un solo contexto - Implementaciones concretas de servicios