Files
roi-theme/Shared/Domain/README.md
FrankZamora 90863cd8f5 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>
2025-11-26 22:53:34 -06:00

128 lines
3.0 KiB
Markdown

# 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