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