LoginSignup
2
3

More than 5 years have passed since last update.

LaravelでDIをしてみる

Posted at

はじめに

LaravelでのDIを試してみたいので、前回作成したAPIのHTTPアクセス部分をDIしてみる。

自作のインターフェースと実装を用意

気分的にLaravelとはネームスペースを分けておく。

HttpAccess.php
namespace Sample\Infra;

interface HttpAccess
{
    public function access(): string;
}
GoogleDocHttpAccess
namespace Sample\Infra;

class GoogleDocHttpAccess implements HttpAccess
{
    public function access(): string
    {
        $url = '[GoogleスプレッドシートのURL]';
前回と同じ内容なので中略
        curl_close($curl);

        return $result;
    }
}

autoloaderに設定を追加

Laravelと別のネームスペースにしたので設定を追加する。

composser.json
    "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "App\\": "app/",
            "Sample\\": "sample/" // ※ココを追加
        }
    },

composer dump-autoload を実行して設定を反映する。

DIのバインド設定を追加

app/Providers/AppServiceProvider.php
    public function register()
    {
        $this->app->bind(HttpAccess::class, GoogleDocHttpAccess::class);
    }

コントローラーでDIする

コンストラクタ・インジェクションでのDIを行う。
タイプヒントによりLaravelが自動的にインスタンスを設定してくれる。

SampleController.php
class SampleController extends Controller
{
    /** @var HttpAccess */
    private $httpAccess;

    public function __construct(HttpAccess $httpAccess)
    {
        $this->httpAccess = $httpAccess;
    }

    public function index()
    {
        return response($this->httpAccess->access());
    }
}

以上の手順で自作クラスをDI出来た。

2
3
0

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
  3. You can use dark theme
What you can do with signing up
2
3