AgentSkillsCN

acc-create-anti-corruption-layer

为 PHP 8.5 生成 DDD 反腐败层。在有界上下文或外部系统之间构建翻译层,包含适配器、翻译器、外观模式,以及单元测试。

SKILL.md
--- frontmatter
name: acc-create-anti-corruption-layer
description: Generates DDD Anti-Corruption Layer for PHP 8.5. Creates translation layer between bounded contexts or external systems. Includes adapters, translators, facades, and unit tests.

Anti-Corruption Layer Generator

Generate DDD-compliant Anti-Corruption Layer (ACL) components for isolating bounded contexts and integrating with external/legacy systems.

When to Use

ScenarioExample
Legacy system integrationERP, CRM, mainframe
Third-party API integrationPayment gateway, shipping API
Bounded context communicationOrder ↔ Inventory contexts
Database migrationOld schema → new domain model
Microservice integrationExternal service with different model

Anti-Corruption Layer Characteristics

  • Isolation: Protects domain model from external/foreign concepts
  • Translation: Converts between domain and external models
  • Facade: Provides simplified interface to external systems
  • Adapter: Implements domain ports using external services
  • No Domain Leakage: External concepts never enter domain layer
  • Bidirectional: Can translate both inbound and outbound

ACL Architecture

code
YOUR BOUNDED CONTEXT
├── DOMAIN LAYER
│   └── Port (Interface) ←────────────┐
│                                      │
├── ANTI-CORRUPTION LAYER             │
│   ├── Adapter (implements Port) ────┘
│   ├── Translator (Domain ↔ External)
│   ├── Facade (External system wrapper)
│   └── External DTOs
│
└── EXTERNAL SYSTEM (Legacy, API, other bounded context)

Generation Process

Step 1: Generate Domain Port

Path: src/Domain/{BoundedContext}/Port/

  1. {ExternalSystem}PortInterface.php — Domain interface for external system

Step 2: Generate External DTOs

Path: src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/DTO/

  1. {ExternalSystem}{Concept}DTO.php — DTOs matching external format

Step 3: Generate Translator

Path: src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/

  1. {ExternalSystem}Translator.php — Domain ↔ External conversion

Step 4: Generate Facade

Path: src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/

  1. {ExternalSystem}Facade.php — Simplified external system interface

Step 5: Generate Adapter

Path: src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/

  1. {ExternalSystem}Adapter.php — Implements domain port

Step 6: Generate Exceptions

Path: src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/Exception/

  1. {ExternalSystem}Exception.php — Domain exception
  2. {ExternalSystem}ConnectionException.php — Infrastructure exception

Step 7: Generate Tests

  1. {ExternalSystem}TranslatorTest.php — Translation tests
  2. {ExternalSystem}AdapterTest.php — Adapter integration tests

File Placement

ComponentPath
Domain Portsrc/Domain/{BoundedContext}/Port/{ExternalSystem}PortInterface.php
External DTOsrc/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/DTO/
Translatorsrc/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/{ExternalSystem}Translator.php
Facadesrc/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/{ExternalSystem}Facade.php
Adaptersrc/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/{ExternalSystem}Adapter.php
Exceptionssrc/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/Exception/
Teststests/Unit/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/

Naming Conventions

ComponentPatternExample
Port{ExternalSystem}PortInterfacePaymentGatewayPortInterface
DTO{ExternalSystem}{Concept}DTOStripeChargeDTO
Translator{ExternalSystem}TranslatorStripeTranslator
Facade{ExternalSystem}FacadeStripeFacade
Adapter{ExternalSystem}AdapterStripeAdapter
Exception{ExternalSystem}ExceptionStripeException

Quick Template Reference

Domain Port

php
interface {ExternalSystem}PortInterface
{
    public function {operation}({DomainParameters}): {DomainReturnType};
}

Translator

php
final readonly class {ExternalSystem}Translator
{
    public function toDomain({ExternalSystem}DTO $dto): {Entity};
    public function toExternal({Entity} $entity): {ExternalSystem}DTO;
}

Adapter

php
final readonly class {ExternalSystem}Adapter implements {ExternalSystem}PortInterface
{
    public function __construct(
        private {ExternalSystem}Facade $facade,
        private {ExternalSystem}Translator $translator,
    ) {}

    public function {operation}({DomainParameters}): {DomainReturnType}
    {
        $dto = $this->translator->toExternal($entity);
        $result = $this->facade->{externalOperation}($dto);
        return $this->translator->toDomain($result);
    }
}

Usage Example

php
// Domain port interface
interface PaymentGatewayPortInterface
{
    public function charge(Payment $payment): PaymentId;
    public function refund(PaymentId $paymentId, Money $amount): void;
}

// Adapter implementation
final readonly class StripeAdapter implements PaymentGatewayPortInterface
{
    public function charge(Payment $payment): PaymentId
    {
        $stripeCharge = $this->translator->toStripeCharge($payment);
        $result = $this->facade->createCharge($stripeCharge);
        return $this->translator->toPaymentId($result);
    }
}

Anti-patterns to Avoid

Anti-patternProblemSolution
Domain using external DTOsExternal concepts leak into domainAlways translate at ACL boundary
Translator in domain layerInfrastructure concern in domainKeep translator in infrastructure
Exposing external exceptionsCoupling to external systemWrap in domain exceptions
Direct API calls from domainNo isolationUse port/adapter pattern
Shared DTOs across ACLsCoupling between integrationsEach ACL has own DTOs
Business logic in translatorWrong responsibilityTranslator only maps data

DI Configuration

yaml
# services.yaml
Domain\Payment\Port\PaymentGatewayPortInterface:
    alias: Infrastructure\Payment\ACL\Stripe\StripeAdapter

Infrastructure\Payment\ACL\Stripe\StripeFacade:
    arguments:
        $client: '@stripe.client'

References

For complete PHP templates and examples, see:

  • references/templates.md — Domain Port, External DTO, Translator, Facade, Adapter, Exception templates
  • references/examples.md — Stripe Payment Gateway ACL complete example and tests