見出し画像

Laravel 学習記録 #011 サービスクラスを学ぶ

Laravelのサービスコンテナについて学習したものをまとめてます。

サービスクラスとは

  • ビジネスロジックを書く場所

  • コントローラーを肥大化させないためにつくられる

  • laravelではサービスコンテナの機能で簡単に依存性注入ができる


サービスクラスをつくってみる

サービスクラスを用意する

appの配下にServicesディレクトリを作成します。
ここにサービスクラスを配置するようにします。
例として、SampleServiceとします。
app\Service\SampleService.php

<?php

namespace App\Services;

// use App\User;

class SampleService
{

}

配置場所に合わせてnamespaceも定義します。

では、コントローラーも用意おきましょう。
App\Http\Controllers\SampleController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SampleController extends Controller
{
    //
}



サービスクラスを使う

作成したサービスクラスにビジネスロジックを追加します。
リクエストに特定の値がある場合に配列にして返す関数を用意してみました。

<?php

namespace App\Services;

class SampleService
{
    public function processCheckboxValues($request)
    {
        $checkboxValues = [];

        // チェックボックスの名前をキーとしてフォームからの入力を取得
        $checkboxNames = ['check1', 'check2', 'check3'];

        foreach ($checkboxNames as $checkboxName) {
            // チェックボックスがチェックされていれば、連想配列に値を追加
            if ($request->has($checkboxName)) {
                $checkboxValues[$checkboxName] = $request->input($checkboxName);
            }
        }

        return $checkboxValues;
    }
}


では、コントローラーで処理を呼び出します。
Laravelでは、「メソッドインジェクション」と呼ばれる仕組みを利用して、依存関係を解決し、クラスのインスタンスを生成できます。

コンストラクタ、または各アクションの引数としてで呼び出せばOKです。
今回はメソッドの引数にします。
processCheckbox(Request $request, SampleService $sampleService)の部分

<?php

namespace App\Http\Controllers;

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

class SampleController extends Controller
{


    public function processCheckbox(Request $request, SampleService $sampleService)
    {
        // サービスクラスのメソッドを呼び出し
        $checkboxValues = $sampleService->processCheckboxValues($request);

        // 結果確認
        dd($checkboxValues);
    }
}

これでprocessCheckboxValuesメソッドが利用できるようになりましたので
実際に確認してみます。

viewファイル
チェックボックスを用意してpostできるようにします。


    <form action="sample" method="post">
        @csrf
        <input type="checkbox" name="check1">
        <input type="checkbox" name="check2">
        <input type="checkbox" name="check3">
        <input type="checkbox" name="check4">
        <input type="checkbox" name="check5">
        <br>
        <input type="submit" value="送信">
    </form>

routeファイル
web.phpにルートを追加します。
indexは画面表示用です。

use App\Http\Controllers\SampleController;
Route::get('sample', [SampleController::class, "index"]);
Route::post('sample', [SampleController::class, "processCheckbox"]);


準備できたので画面で
check1,3,5にチェックを入れて確認します。

結果をコントローラーに記述した
dd($checkboxValues);
で確認

array:2 [▼ // app/Http/Controllers/SampleController.php:22
  "check1" => "on"
  "check3" => "on"
]

このように、チェックがonの値のみを連想配列として返すことができています。

今回の処理はサンプルですが
実際は、特定の値がある時のみ条件を追加して検索処理
のようなビジネスロジックを記述することで、コントローラーがスッキリしたままプログラムを組むことができそうです。

この記事が気に入ったらサポートをしてみませんか?