ファイル構成
app/Http/Controllers/Api/User/HogeController app/Domain/Repositories/BaseRepository [インターフェース:Domain] app/Domain/Repositories/HogeRepository [インターフェース:Domain] app/Infrastructure/Repositories/BaseRepository [抽象クラス:Domain] app/Infrastructure/Repositories/HogeRepository [具象クラス:Infrastructure] app/Models/Hoge; app/Providers/RepositoryServiceProvider [bind箇所]
app/Infrastructure/Repositories/HogeRepository [具象クラス:Infrastructure]
namespace App\Infrastructure\Repositories; use App\Models\Hoge; use App\Domain\Repositories\HogeRepository as HogeRepositoryInterface; class HogeRepository extends BaseRepository implements HogeRepositorynterface { }
app/Domain/Repositories/HogeRepository [インターフェース:Domain]
namespace App\Domain\Repositories; interface HogeRepository extends BaseRepository { }
app/Domain/Repositories/BaseRepository [インターフェース:Domain]
namespace App\Domain\Repositories; interface BaseRepository { public function create(Model $model): Model; public function update(Model $model): Model; }
app/Infrastructure/Repositories/BaseRepository [抽象クラス:Domain]
namespace App\Infrastructure\Repositories; use App\Domain\Repositories\BaseRepository as BaseRepositoryInterface; abstract class BaseRepository implements BaseRepositoryInterface { private const DEFAULT_LIMIT = 100; /** * @var Model */ private Model $model; }
bindについて。
RepositoryServiceProvider
namespace App\Providers; use App\Infrastructure\Repositories\HogeRepository; use App\Domain\Repositories\HogeRepository as HogeRepositoryInterface; use App\Models\Hoge; class RepositoryServiceProvider extends ServiceProvider { /** * Register services. * * @return void */ public function register() { $this->app->bind( HogeRepositoryInterface::class, <= [インターフェース:Domain] fn() => new HogeRepository(new Hoge()) <= [具象クラス:Infrastructure] ); } }
app/Http/Controllers/Api/User/HogeController [コントローラ]
namespace App\Http\Controllers\Api\User; use App\Domain\Repositories\BaseRepository; <= インターフェース [ドメイン層] use App\Domain\Repositories\HogeRepository; <= インターフェース [ドメイン層] class HogeController extends Controller { public function __construct() { $this->middleware(function (Request $request, $next) { // [インターフェース] BaseRepository // [インターフェース] HogeRepository app()->bind(BaseRepository::class, fn($app) => $app->make(HogeRepository::class)); return $next($request); }); } }