search
LoginSignup
1

More than 1 year has passed since last update.

Organization

Laravel の Tinker で DI

Laravel では Service Provider に依存解決のルールを記述することで、 Constructor Injection のような形で DI が実現可能です。
この DI を Tinker の実行時に行う方法がすぐ出てこなかったので、そのメモです。

TL;DR

app() ヘルパー関数または App ファサードを使えば良い。

Repository パターンを用いる際に以下のような ServiceProvider を作成した場合について考えます。

RepositoryServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Domain\User\UserRepository;
use Infra\User\UserRepository as EloquentUserRepository;

class RepositoryServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind(UserRepository::class, EloquentUserRepository::class);
    }
}

Tinker 中で以下のように DI が実現できます。

$ php artisan tinker
Psy Shell v0.10.4 (PHP 7.4.1  cli) by Justin Hileman
>>> $repository = app()->make(\Domain\User\UserRepository::class);
>>> // or
>>> // App::make(\Domain\User\UserRepository::class);
>>> $user = $repository->get(1);

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1