Files
roi-theme/Shared/Domain
FrankZamora c23dc22d76 feat(templates): add archive-header and post-grid components
- Add ArchiveHeader component (schema, renderer, formbuilder)
- Add PostGrid component (schema, renderer, formbuilder)
- Unify archive templates (home, archive, category, tag,
  author, date, search)
- Add page visibility system with VisibilityDefaults
- Register components in AdminDashboardRenderer
- Fix boolean conversion in functions-addon.php
- All 172 unit tests passed

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-06 20:36:27 -06:00
..

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:

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:

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:

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:

// 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