Awesome-claude-code create-anti-corruption-layer
Generates DDD Anti-Corruption Layer for PHP 8.4. Creates translation layer between bounded contexts or external systems. Includes adapters, translators, facades, and unit tests.
install
source · Clone the upstream repo
git clone https://github.com/dykyi-roman/awesome-claude-code
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/dykyi-roman/awesome-claude-code "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/create-anti-corruption-layer" ~/.claude/skills/dykyi-roman-awesome-claude-code-create-anti-corruption-layer && rm -rf "$T"
manifest:
skills/create-anti-corruption-layer/SKILL.mdsource content
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
| Scenario | Example |
|---|---|
| Legacy system integration | ERP, CRM, mainframe |
| Third-party API integration | Payment gateway, shipping API |
| Bounded context communication | Order ↔ Inventory contexts |
| Database migration | Old schema → new domain model |
| Microservice integration | External 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
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/
— Domain interface for external system{ExternalSystem}PortInterface.php
Step 2: Generate External DTOs
Path:
src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/DTO/
— DTOs matching external format{ExternalSystem}{Concept}DTO.php
Step 3: Generate Translator
Path:
src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/
— Domain ↔ External conversion{ExternalSystem}Translator.php
Step 4: Generate Facade
Path:
src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/
— Simplified external system interface{ExternalSystem}Facade.php
Step 5: Generate Adapter
Path:
src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/
— Implements domain port{ExternalSystem}Adapter.php
Step 6: Generate Exceptions
Path:
src/Infrastructure/{BoundedContext}/ACL/{ExternalSystem}/Exception/
— Domain exception{ExternalSystem}Exception.php
— Infrastructure exception{ExternalSystem}ConnectionException.php
Step 7: Generate Tests
— Translation tests{ExternalSystem}TranslatorTest.php
— Adapter integration tests{ExternalSystem}AdapterTest.php
File Placement
| Component | Path |
|---|---|
| Domain Port | |
| External DTO | |
| Translator | |
| Facade | |
| Adapter | |
| Exceptions | |
| Tests | |
Naming Conventions
| Component | Pattern | Example |
|---|---|---|
| Port | | |
| DTO | | |
| Translator | | |
| Facade | | |
| Adapter | | |
| Exception | | |
Quick Template Reference
Domain Port
interface {ExternalSystem}PortInterface { public function {operation}({DomainParameters}): {DomainReturnType}; }
Translator
final readonly class {ExternalSystem}Translator { public function toDomain({ExternalSystem}DTO $dto): {Entity}; public function toExternal({Entity} $entity): {ExternalSystem}DTO; }
Adapter
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
// 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-pattern | Problem | Solution |
|---|---|---|
| Domain using external DTOs | External concepts leak into domain | Always translate at ACL boundary |
| Translator in domain layer | Infrastructure concern in domain | Keep translator in infrastructure |
| Exposing external exceptions | Coupling to external system | Wrap in domain exceptions |
| Direct API calls from domain | No isolation | Use port/adapter pattern |
| Shared DTOs across ACLs | Coupling between integrations | Each ACL has own DTOs |
| Business logic in translator | Wrong responsibility | Translator only maps data |
DI Configuration
# 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:
— Domain Port, External DTO, Translator, Facade, Adapter, Exception templatesreferences/templates.md
— Stripe Payment Gateway ACL complete example and testsreferences/examples.md