(例)UserクラスはUserNameクラスを使用 <?php namespace App\Domain\User\Entity; use App\Domain\User\ValueObject\UserName; final class User { // UserNameに依存 public function method(UserName $name): string { return "Hello! " . $name->getName(); } }
より安全なシステム <?php namespace App\Domain\User\Entity; use App\Domain\User\ValueObject\UserName; final class User { private UserName $name; public function __construct(UserName $name) { $this->name = $name; } } <?php $name = new UserName(); $user = new User($name); // インジェクション
function findById(FooId $id): Foo; // IDを元にドメインモデルを全て取得 public function findAll(): array; } <?php namespace App\Infrastructure\Foo; class FooRepositoryImpl implements FooRepositoryIF { public function findById(FooId $id): Foo // 実装を強制 { } public function findAll(): array { } } 実装が抽象(インターフェース)に依存 ※ 他言語でも類似する機能を使う インターフェースリポジトリ 実装リポジトリクラス