【保存】混乱するbind, DIの紐解き

noel-ingenieur.hateblo.jp

ファイル構成

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);
        });
    }
    
}