搜索

PythonReactSEOPDF
GitHub Skill

add-bc-contract

Add Contract for inter-BC communication using Provider pattern. Use when one Bounded Context needs to access data from another BC (e.g., Inventory needs Articles from Admin). Creates Contract interface, Provider implementation, and configuration.

Dev-Int☆ 0 仓库 Stars0 仓库 Forks

安装与使用

请根据来源仓库和你的 AI 工具说明安装此技能。先阅读技能文件和依赖要求,再添加到工作流。

查看来源 ↗使用指南

技能说明

Add BC Contract

Create Contract for inter-BC communication using Provider pattern.


When to Use

  • BC needs to read data from another BC
  • Creating select options from another BC (TwigComponent)
  • Exposing domain data to other contexts

Inputs/Outputs

Input Example Output
provider_bc Admin ProviderBC/Contracts/ContractName.php
consumer_bc Inventory ProviderBC/Adapters/Contracts/ProviderBCContractName.php
contract_name ArticleProvider ProviderBC/Frameworks/config/services.yaml (updated)
methods ['provide', 'provideAll'] ConsumerBC/Frameworks/deptrac.yaml (updated)

Process

Step File Action
Contract ProviderBC/Contracts/ContractName.php Interface with methods (template: contract.php.tpl)
Provider ProviderBC/Adapters/Contracts/ProviderBCContractName.php Implementation with Finder (template: provider.php.tpl)
Config ProviderBC/Frameworks/config/services.yaml Autowire Contract → Provider
Deptrac ConsumerBC/Frameworks/deptrac.yaml Allow ProviderBC\Contracts
Validate - make cs-fixer && make stan && bin/deptrac analyse && make qa

Structures

Contract (interface in ProviderBC/Contracts/):

interface ContractName {
    public function provide(string $uuid): EntityData; // throws
    public function provideAll(?array $ids = null): iterable;
}

Provider (readonly, uses Finder):

final readonly class ProviderBCContractName implements ContractName {
    public function __construct(private EntityFinder $finder) {} // Finder, NOT Repository

    public function provide(string $uuid): EntityData {
        $entity = $this->finder->find($uuid) ?? throw EntityNotFound::fromUuid($uuid);
        return $this->toData($entity);
    }

    public function provideAll(?array $ids = null): iterable {
        $entities = $ids ? $this->finder->findByUuids($ids) : $this->finder->findAll();
        foreach ($entities as $entity) {
            yield $this->toData($entity);
        }
    }

    private function toData(Entity $entity): EntityData { /* convert to DTO */ }
}

Config (ProviderBC/Frameworks/config/services.yaml):

ProviderBC\Contracts\ContractName:
    class: ProviderBC\Adapters\Contracts\ProviderBCContractName

Deptrac (ConsumerBC/Frameworks/deptrac.yaml):

ConsumerBC\Adapters:
    - ProviderBC\Contracts  # ONLY Contracts, NOT Entities/UseCases

See: docs/GLOSSARY.md#contract, #provider, #data-dto


Rules

CRITICAL:

  • Provider uses Finder (NOT Repository) - providers are read-only
  • Consumer depends ONLY on Contract interface (never Provider implementation)
  • Deptrac allows ONLY Contracts namespace (not Entities/UseCases)

Locations:

  • Contract: ProviderBC/Contracts/
  • Provider: ProviderBC/Adapters/Contracts/
  • Exception: ProviderBC/Contracts/Exception/ if needed
  • DTO: ProviderBC/Contracts/DTO/ if complex data

Naming:

  • Contract: {Entity}Provider (e.g., ArticleProvider)
  • Provider: {BC}{Contract} (e.g., AdminArticleProvider)

Variants

Query Provider (data access):

public function provide(string $uuid): EntityData;
public function provideAll(?array $ids = null): iterable;

TwigComponent Provider (form select):

/** @return array<string, string> [uuid => label] */
public function getAllForChoice(): array;

Templates

  • contract.php.tpl - Contract interface
  • provider.php.tpl - Provider implementation

Location: .claude/templates/


References

  • Contract/Provider pattern: docs/GLOSSARY.md#contract, #provider
  • Inter-BC architecture: docs/architecture.md#inter-bc
  • Detailed guide: docs/guides/bounded-contexts.md

使用示例

查看来源仓库中的使用示例与配置说明。

查看来源 ↗

来源历史

收录时间
2026-01-20
索引更新时间
2026-01-26
Branch
main

收录与同步日期属于本站记录。源码修改历史请查看来源仓库。

GitHub ↗

chat Comments (0)

chat_bubble_outline

No comments yet. Be the first to share your thoughts!