AgentSkillsCN

acc-create-factory

为 PHP 8.5 生成 DDD 工厂。通过验证与封装的创建逻辑,为复杂领域对象的实例化提供工厂支持,并附带单元测试。

SKILL.md
--- frontmatter
name: acc-create-factory
description: Generates DDD Factory for PHP 8.5. Creates factories for complex domain object instantiation with validation and encapsulated creation logic. Includes unit tests.

Factory Generator

Generate DDD-compliant Factories for complex domain object creation.

Factory Characteristics

  • Encapsulates Creation: Hides complex instantiation logic
  • Validates Input: Ensures valid object creation
  • Named Constructors: Provides semantic creation methods
  • Domain Layer: Lives in Domain, no infrastructure dependencies
  • Returns Valid Objects: Never creates invalid domain objects
  • Static or Instance: Static for simple, instance for dependencies

When to Use Factory

ScenarioExample
Complex construction logicOrderFactory::createFromCart()
Multiple creation pathsUser::register(), User::createAdmin()
Aggregate creationPolicyFactory::createWithCoverage()
Reconstruction from persistenceOrderFactory::reconstitute()
Creation with validationInvoiceFactory::create()

Generation Process

Step 1: Determine Factory Type

  • Static Factory: No dependencies, simple validation
  • Instance Factory: Needs domain services or repositories

Step 2: Generate Factory

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

  1. {Entity}Factory.php — Main factory class

Step 3: Define Creation Methods

  1. create() — Primary creation with validation
  2. createFrom{Source}() — Creation from other objects
  3. reconstitute() — Reconstruction from persistence (no validation)

Step 4: Generate Tests

Path: tests/Unit/Domain/{BoundedContext}/Factory/


File Placement

ComponentPath
Factorysrc/Domain/{BoundedContext}/Factory/
Unit Teststests/Unit/Domain/{BoundedContext}/Factory/

Naming Conventions

PatternExample
Factory Class{EntityName}Factory
Create Methodcreate(), createFrom{Source}()
Named Constructorcreate{Variant}()
Reconstitutereconstitute()
Validationvalidate{Aspect}()

Quick Template Reference

Static Factory

php
final class {Entity}Factory
{
    public static function create({parameters}): {Entity}
    {
        self::validate({parameters});
        return new {Entity}({constructorArgs});
    }

    public static function createFrom{Source}({SourceType} $source): {Entity}
    {
        return new {Entity}({mappedArgs});
    }

    public static function reconstitute({allFields}): {Entity}
    {
        return new {Entity}({allArgs});
    }

    private static function validate({parameters}): void
    {
        {validationLogic}
    }
}

Instance Factory

php
final readonly class {Entity}Factory
{
    public function __construct(
        private {DomainService} $service,
        private {Repository} $repository
    ) {}

    public function create({parameters}): {Entity}
    {
        {creationLogicWithDependencies}
    }
}

Anti-patterns to Avoid

Anti-patternProblemSolution
Infrastructure in FactoryDB calls in factoryKeep pure domain logic
No ValidationCreates invalid objectsValidate before creation
Too Many ParametersHard to useUse Value Objects, Builder
Mutable FactoryStateful creationMake stateless or readonly
Missing ReconstituteCan't hydrate from DBAdd reconstitute method

References

For complete PHP templates and examples, see:

  • references/templates.md — Static Factory, Instance Factory, Test templates
  • references/examples.md — Order, User, Policy factory examples and tests