AgentSkillsCN

acc-create-specification

为 PHP 8.5 生成 DDD 规范。创建可复用的业务规则对象,支持复合模式下的校验、筛选与查询,并附带单元测试。

SKILL.md
--- frontmatter
name: acc-create-specification
description: Generates DDD Specification for PHP 8.5. Creates reusable business rule objects for validation, filtering, and querying with composite pattern support. Includes unit tests.

Specification Generator

Generate DDD-compliant Specifications for encapsulating business rules and filtering logic.

Specification Characteristics

  • Single Responsibility: One business rule per specification
  • Composable: AND, OR, NOT combinations
  • Reusable: Same spec for validation and querying
  • Domain Language: Named using ubiquitous language
  • Testable: Easy to unit test in isolation
  • Immutable: No state changes after creation

When to Use Specification

ScenarioExample
Business rule validationIsActiveCustomer, CanPlaceOrder
Collection filteringOverdueInvoice, PremiumProduct
Repository queriesOrdersByCustomer, ActiveUsers
Policy enforcementEligibleForDiscount, CanBeShipped
Complex conditionsComposite AND/OR specifications

Generation Process

Step 1: Generate Base Infrastructure

Path: src/Domain/Shared/Specification/

  1. SpecificationInterface.php — Generic interface with isSatisfiedBy()
  2. AbstractSpecification.php — Base with AND/OR/NOT methods
  3. AndSpecification.php — Composite AND
  4. OrSpecification.php — Composite OR
  5. NotSpecification.php — Negation wrapper

Step 2: Generate Concrete Specification

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

  1. {Name}Specification.php — Implements business rule

Step 3: Generate Tests

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


File Placement

ComponentPath
Base Interfacesrc/Domain/Shared/Specification/
Abstract Specsrc/Domain/Shared/Specification/
Compositessrc/Domain/Shared/Specification/
Concrete Specssrc/Domain/{BoundedContext}/Specification/
Unit Teststests/Unit/Domain/{BoundedContext}/Specification/

Naming Conventions

PatternExample
Is{Condition}SpecificationIsActiveCustomerSpecification
Has{Property}SpecificationHasPurchaseHistorySpecification
Can{Action}SpecificationCanBeCancelledSpecification
Factory MethodIsOverdueInvoiceSpecification::now()

Quick Template Reference

Specification Interface

php
/**
 * @template T
 */
interface SpecificationInterface
{
    public function isSatisfiedBy(mixed $candidate): bool;
    public function and(self $other): self;
    public function or(self $other): self;
    public function not(): self;
}

Concrete Specification

php
/**
 * @extends AbstractSpecification<{Entity}>
 */
final readonly class {Name}Specification extends AbstractSpecification
{
    public function __construct({parameters}) {}

    public function isSatisfiedBy(mixed $candidate): bool
    {
        if (!$candidate instanceof {Entity}) {
            return false;
        }
        return {businessRule};
    }
}

Composite Usage

php
$eligible = $isActive
    ->and($hasPurchases)
    ->and($isNotBlacklisted->not());

$customers = array_filter(
    $all,
    fn($c) => $eligible->isSatisfiedBy($c)
);

Anti-patterns to Avoid

Anti-patternProblemSolution
God SpecificationToo many conditionsSplit into composable specs
Side EffectsModifies candidateKeep pure, read-only
InfrastructureDB calls in specKeep in domain, use for in-memory
Weak TypingisSatisfiedBy(mixed)Add type check first
No CompositionCopy-paste conditionsUse AND/OR composition

References

For complete PHP templates and examples, see:

  • references/templates.md — Interface, Abstract, Composite, Concrete templates
  • references/examples.md — Customer, Product, Invoice, Order specifications and tests