Laravelでサービスクラスの用途と使い方

Laravelでサービスクラスの用途と使い方

92 回閲覧されました

みなさんこんにちは、jonioです。

今回はサービスクラスについてのメモになります。

メモの内容

下記になります。

  • 用途
  • 作成方法
  • コードの書き方
  • 使わない方がいい人

用途

処理を切り出して色々なコントローラーで利用したい時に使います。

私の場合はこういう時に使います。

例えばトップページを表示したいコントローラーがあったとします。

そのコントローラーにモデルがない場合はモデルがテーブルにアクセスするのをコントローラーでしないといけません。

コントローラーでモデルの処理をするのはMVCの役割に反しています。

こんな時にサービスクラスを使います。

作成方法

コマンドがないので手動です。

「Laravelのプロジェクト > app」以下にフォルダを作成します。

フォルダ名を「Services」とします。

その下の階層にサービスクラスを記述するファイルを作成します。

ファイル名を「DataService.php」とします。

コードの書き方

まず下記のコードを書きます。

<?php

namespace App\Services;

class DataService
{
}

そして処理をする為のコードを書きます。

モデルに該当する書き方と同じです。

例えば下記にしたとします。

<?php

namespace App\Services;
use App\Models\Movie;

class DataService
{
  public function getMovies()
  {
    return Movie::where('delete_flag', 0)->get();
  }
}

そしてサービスクラスをコントローラーに使う為に下記のコードを書きます。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Services\DataService;          //この行を追加

class TopController extends Controller
{

    //ここから追加
    private $dataService;

    public function __construct(DataService $dataService)
    {
        $this->dataService = $dataService;
    }
    //ここまで追加
    
    
}

サービスクラスを使う為の記述をします。

そしてサービスクラスに書いたメソッドを使う為の記述をします。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Services\DataService;

class TopController extends Controller
{
    private $dataService;

    public function __construct(DataService $dataService)
    {
        $this->dataService = $dataService;
    }
    
    public function index() {
      $movies = $this->dataService->getMovies();     //←でサービスクラスのメソッドを呼び出している

      return view('welcome', compact('movies');
    }  
}

18行目でサービスクラスのメソッドを呼び出していますが「$this->dataService->サービスクラスのメソッド名」と記述すればいいです。

使わない方がいい人

Laravelを使いたての人です。

コントローラーのコードの10行目〜15行目の意味が分からないと思います。

private $dataService;

public function __construct(DataService $dataService)
{
  $this->dataService = $dataService;
}

諸学者は勉強しないといけない内容が多いはずなのでコントローラーにモデルの処理を書いてもいいと思います。