Master backend architectures, REST API design, microservices, and server-side development across multiple languages. Use this as a central index to access specialized sub-skills.
日本語の概要は準備中です。原文の説明を表示しています。
Generates Transactional Outbox pattern components for PHP 8.5. Creates OutboxMessage entity, repository, publisher, and processor with unit tests.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Creates Transactional Outbox pattern infrastructure for reliable event publishing.
Path: src/Domain/Shared/Outbox/
OutboxMessage.php — Immutable message entityOutboxRepositoryInterface.php — Repository contractPath: src/Application/Shared/
Port/Output/MessagePublisherInterface.php — Publisher portPort/Output/DeadLetterRepositoryInterface.php — Dead letter portOutbox/ProcessingResult.php — Result value objectOutbox/MessageResult.php — Result enumOutbox/OutboxProcessor.php — Processing servicePath: src/Infrastructure/
Persistence/Doctrine/Repository/DoctrineOutboxRepository.phpConsole/OutboxProcessCommand.phptests/Unit/Domain/Shared/Outbox/OutboxMessageTest.phptests/Unit/Application/Shared/Outbox/OutboxProcessorTest.php// In UseCase - save outbox message in SAME transaction
$this->connection->transactional(function () use ($order, $event) {
$this->orderRepository->save($order);
$this->outboxRepository->save(
OutboxMessage::create(
id: Uuid::uuid4()->toString(),
aggregateType: 'Order',
aggregateId: $order->id()->toString(),
eventType: 'order.placed',
payload: $event->toArray()
)
);
});
Include metadata for tracing:
| Layer | Path |
|---|---|
| Domain Entity | src/Domain/Shared/Outbox/ |
| Domain Interface | src/Domain/Shared/Outbox/ |
| Application Service | src/Application/Shared/Outbox/ |
| Application Port | src/Application/Shared/Port/Output/ |
| Infrastructure Repo | src/Infrastructure/Persistence/Doctrine/Repository/ |
| Infrastructure Console | src/Infrastructure/Console/ |
| Unit Tests | tests/Unit/{Layer}/{Path}/ |
| Component | Pattern | Example |
|---|---|---|
| Entity | {Name} | OutboxMessage |
| Repository Interface | {Name}RepositoryInterface | OutboxRepositoryInterface |
| Repository Impl | Doctrine{Name}Repository | DoctrineOutboxRepository |
| Service | {Name}Processor | OutboxProcessor |
| Command | {Name}Command | OutboxProcessCommand |
| Test | {ClassName}Test | OutboxMessageTest |
final readonly class OutboxMessage
{
public static function create(
string $id,
string $aggregateType,
string $aggregateId,
string $eventType,
array $payload,
?string $correlationId = null,
?string $causationId = null
): self;
public function isProcessed(): bool;
public function isPoisoned(int $maxRetries): bool;
public function payloadAsArray(): array;
public function withProcessed(): self;
public function withRetryIncremented(): self;
}
interface OutboxRepositoryInterface
{
public function save(OutboxMessage $message): void;
public function findUnprocessed(int $limit = 100): array;
public function markAsProcessed(string $id): void;
public function incrementRetry(string $id): void;
public function delete(string $id): void;
}
final readonly class OutboxProcessor
{
public function process(int $batchSize = 100): ProcessingResult;
}
// In UseCase
$message = OutboxMessage::create(
id: Uuid::uuid4()->toString(),
aggregateType: 'Order',
aggregateId: $order->id()->toString(),
eventType: 'order.placed',
payload: [
'order_id' => $order->id()->toString(),
'customer_id' => $order->customerId()->toString(),
'total' => $order->total()->amount(),
],
correlationId: $command->correlationId
);
$this->outboxRepository->save($message);
# One-shot processing
php bin/console outbox:process --batch-size=100
# Daemon mode
php bin/console outbox:process --daemon --interval=1000
# Symfony services.yaml
Domain\Shared\Outbox\OutboxRepositoryInterface:
alias: Infrastructure\Persistence\Doctrine\Repository\DoctrineOutboxRepository
Application\Shared\Port\Output\MessagePublisherInterface:
alias: Infrastructure\Messaging\RabbitMq\RabbitMqPublisher
Application\Shared\Outbox\OutboxProcessor:
arguments:
$maxRetries: 5
CREATE TABLE outbox_messages (
id VARCHAR(36) PRIMARY KEY,
aggregate_type VARCHAR(255) NOT NULL,
aggregate_id VARCHAR(255) NOT NULL,
event_type VARCHAR(255) NOT NULL,
payload JSONB NOT NULL,
correlation_id VARCHAR(255),
causation_id VARCHAR(255),
created_at TIMESTAMP(6) NOT NULL,
processed_at TIMESTAMP(6),
retry_count INT NOT NULL DEFAULT 0
);
CREATE INDEX idx_outbox_unprocessed
ON outbox_messages (processed_at, created_at)
WHERE processed_at IS NULL;
For complete PHP templates and test examples, see:
references/templates.md — All component templatesreferences/tests.md — Unit test examplesまだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Master backend architectures, REST API design, microservices, and server-side development across multiple languages. Use this as a central index to access specialized sub-skills.
日本語の概要は準備中です。原文の説明を表示しています。
在每次回复中使用固定前缀并列出本次实际参考的指令/文件,便于校验是否遵循上下文与规则。
日本語の概要は準備中です。原文の説明を表示しています。
Automate 21risk tasks via Rube MCP (Composio). Always search tools first for current schemas.
日本語の概要は準備中です。原文の説明を表示しています。
Automate 2chat tasks via Rube MCP (Composio). Always search tools first for current schemas.
日本語の概要は準備中です。原文の説明を表示しています。
Arquitecto de Soluciones Principal y Consultor Tecnológico de Andru.ia. Diagnostica y traza la hoja de ruta óptima para proyectos de IA en español.
日本語の概要は準備中です。原文の説明を表示しています。
[00] META. Orchestrate skills into dynamic chains for complex tasks. Analyzes the task, discovers available skills, builds an optimal chain, explains why each skill is needed, and executes step-by-step with user confirmation. Use for any complex task requiring multiple thinking/research/analysis steps. Triggers on "plan this", "how to approach", "what's the strategy", "build a plan", or any multi-step problem requiring skill orchestration.
日本語の概要は準備中です。原文の説明を表示しています。