コハクウェブデザイン

Laravelでサービスコンテナを使ってみよう

Laravelの主要な機能の一つとしてサービスコンテナというものがあります。
これが難しくて投げ出しちゃいたくなるんだけど、深入りせず少しだけ触るところからはじめてみましょう。

サービスコンテナの役割を簡単に表すと

・Laravelが用意してくれたクラスや自分が作ったクラスから勝手にインスタンスを作成してくれる。
・作成したインスタンスを管理してくれる。
という感じでしょうか。
わかりにくいですね(笑)

実際に使ってみたほうがわかりやすいと思いますのでいってみましょう。
ながれはこんな感じです。
1.自作のクラスを用意する(サービス)
2.サービスをコントローラで使う

1.自作のクラスを用意する

では最初に自分でクラスを作ってみましょう。
「app」の中に「MyClasses」というフォルダを作ります。
さらにその中に「Dog.php」というファイルを作ります。
Dog.phpの中身は以下のようにしてみます。

<?php
namespace App\MyClasses;

class Dog
{
    private $name;
    private $kind;
    
    public function __construct()
    {
        $this->name = 'ポチ';
        $this->kind = '柴犬';
    }

    public function getDogData()
    {
        return 'こちらは' . $this->kind . 'の' . $this->name . 'です。';
    }
}

犬種と名前が返ってくる簡単な機能(サービス)です。

2.サービスをコントローラで使う

作成したサービスをコントローラで使ってみましょう。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\MyClasses\Dog; // <-忘れずに

class DogController extends Controller
{
    public function index(Dog $dog)
    {
        $dog_data = $dog->getDogData();
        return view('index', ['data' => $dog_data]);
    }
}

これで先程作成したDogサービスからのデータをビューに渡すことができます。

ここで不思議なのが、Dog.phpのクラスをnewした覚えがないのにDogController.phpでデータをゲットできていることです。

実はこれがサービスコンテナの力です。
最初に説明したようにサービスコンテナの主な機能は「インスタンスを作成し、管理してくれる」ことです。

今回の場合で言うと
1.Dog.phpでDogクラス(サービス)を定義し
2.サービスコンテナがいつの間にかDog.phpのインスタンスを作り
3.コントローラでindexメソッドの引数に(Dog $dog)と入れるだけでインスタンスを使うことができた
ということです。

わかったようなわからないような感じですが、最初はそんな感じで大丈夫だと思います(笑)

なぜわざわざサービスコンテナの中でインスタンスを作成するのか?

ところでなんでわざわざサービスコンテナでインスタンスを作成するのでしょうか?
コントローラの中でnewすれば同じことができますよね?
サービスコンテナを使う理由は、1つのインスタンスをいろんな場所で使い回す場合があるからです。

例えば1つしかインスタンスを作成しないサービス(シングルトンと言う)がある場合、色んな所でnewしてインスタンスを作ることはできません。
なのでサービスコンテナが1つだけインスタンスを作り、管理し、そのインスタンスをいろんな場所で使うわけです。

サービスコンテナは基本的に自動でやってくれる

サービスコンテナは賢いやつで、こちらが命令を出さなくても先程のようにサービスを作りコントローラなどに読み込めば勝手にインスタンスを作成して組み込んでくれます。
※組み込むことを「結合」と呼ぶそうです。

基本的にサービスコンテナが自動的にやってくれるのですが、自分で明示的に組み込む(結合する)こともできます。