| name | acc-create-decorator |
| description | Generates Decorator pattern for PHP 8.5. Creates wrapper classes for dynamic behavior addition without inheritance. Includes unit tests. |
Decorator Pattern Generator
Creates Decorator pattern infrastructure for dynamically adding behavior to objects.
When to Use
| Scenario | Example |
|---|
| Cross-cutting concerns | Logging, caching, metrics |
| Transparent wrapping | Add behavior without changing interface |
| Stackable features | Multiple decorators combined |
| Runtime behavior | Dynamic feature addition |
Component Characteristics
Component Interface
- Defines core operations
- Shared by concrete and decorators
- Enables transparent wrapping
Abstract Decorator
- Wraps component
- Delegates to wrapped object
- Base for concrete decorators
Concrete Decorators
- Add specific behavior
- Before/after wrapped call
- Can be stacked
Generation Process
Step 1: Generate Component Interface
Path: src/Domain/{BoundedContext}/
{Name}Interface.php — Core operations contract
Step 2: Generate Abstract Decorator
Path: src/Domain/{BoundedContext}/Decorator/
Abstract{Name}Decorator.php — Base decorator with delegation
Step 3: Generate Concrete Decorators
Path: src/Infrastructure/{BoundedContext}/Decorator/
Logging{Name}Decorator.php — Logging behavior
Caching{Name}Decorator.php — Caching behavior
Metrics{Name}Decorator.php — Performance metrics
Transactional{Name}Decorator.php — Transaction wrapping
Step 4: Generate Factory (Optional)
Path: src/Infrastructure/{BoundedContext}/
{Name}Factory.php — Stack decorators in correct order
Step 5: Generate Tests
{Feature}{Name}DecoratorTest.php — Individual decorator tests
File Placement
| Component | Path |
|---|
| Interface | src/Domain/{BoundedContext}/ |
| Abstract Decorator | src/Domain/{BoundedContext}/Decorator/ |
| Infrastructure Decorators | src/Infrastructure/{BoundedContext}/Decorator/ |
| Factory | src/Infrastructure/{BoundedContext}/ |
| Unit Tests | tests/Unit/Infrastructure/{BoundedContext}/Decorator/ |
Naming Conventions
| Component | Pattern | Example |
|---|
| Interface | {Name}Interface | OrderServiceInterface |
| Abstract Decorator | Abstract{Name}Decorator | AbstractOrderServiceDecorator |
| Concrete Decorator | {Feature}{Name}Decorator | LoggingOrderServiceDecorator |
| Factory | {Name}Factory | OrderServiceFactory |
| Test | {ClassName}Test | LoggingOrderServiceDecoratorTest |
Quick Template Reference
Abstract Decorator
abstract class Abstract{Name}Decorator implements {Name}Interface
{
public function __construct(
protected readonly {Name}Interface $wrapped
) {}
public function {operation}({params}): {returnType}
{
return $this->wrapped->{operation}({args});
}
}
Concrete Decorator
final readonly class {Feature}{Name}Decorator extends Abstract{Name}Decorator
{
public function __construct(
{Name}Interface $wrapped,
private {Dependency} $dependency
) {
parent::__construct($wrapped);
}
public function {operation}({params}): {returnType}
{
{beforeBehavior}
$result = parent::{operation}({args});
{afterBehavior}
return $result;
}
}
Usage Example
$service = new TransactionalOrderServiceDecorator(
new CachingOrderServiceDecorator(
new MetricsOrderServiceDecorator(
new LoggingOrderServiceDecorator(
$baseService,
$logger
),
$metrics
),
$cache
),
$transaction
);
$order = $service->create($command);
Common Decorators
| Decorator | Purpose |
|---|
| Logging | Log method calls and results |
| Caching | Cache expensive operations |
| Metrics | Collect performance metrics |
| Transaction | Wrap in database transaction |
| Retry | Retry failed operations |
| CircuitBreaker | Protect from cascading failures |
| Validation | Validate inputs before execution |
Anti-patterns to Avoid
| Anti-pattern | Problem | Solution |
|---|
| Missing Interface | Can't swap decorators | Use shared interface |
| Leaky Abstraction | Decorator-specific methods | Keep interface clean |
| Order Dependency | Wrong stacking order | Document decorator order |
| Heavy Decorators | Too much logic | Keep decorators focused |
| No Abstract | Code duplication | Create abstract decorator |
References
For complete PHP templates and examples, see:
references/templates.md — Abstract Decorator, Concrete Decorator, Interface templates
references/examples.md — Logging, Caching, Metrics, Transaction decorators and tests