Skip to content
Back to skills

Add Bc Contract

ASecurity

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.

  • 666 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 2, 2026
ai-agentsphp

Security analysis

A100/100

Scanned September 2, 2026

npx -y skills add majiayu000/claude-skill-registry --skill add-bc-contract --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Add Bc Contract?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Add Bc Contract
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/majiayu000-add-bc-contract-claude-skill-registry/badge)](https://www.skillsdirectory.com/skills/majiayu000-add-bc-contract-claude-skill-registry)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: add-bc-contract
description: 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.
---

# 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/`):
```php
interface ContractName {
    public function provide(string $uuid): EntityData; // throws
    public function provideAll(?array $ids = null): iterable;
}
```

**Provider** (`readonly`, uses Finder):
```php
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`):
```yaml
ProviderBC\Contracts\ContractName:
    class: ProviderBC\Adapters\Contracts\ProviderBCContractName
```

**Deptrac** (`ConsumerBC/Frameworks/deptrac.yaml`):
```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):
```php
public function provide(string $uuid): EntityData;
public function provideAll(?array $ids = null): iterable;
```

**TwigComponent Provider** (form select):
```php
/** @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`

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.