はじめに
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出来た。