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>
128 lines
3.0 KiB
Markdown
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
|