【laravel9】同じコントローラで別メソッドを呼び出す方法

「この処理、別のメソッドに分けたいな」と思うことはありませんか?
いざ分けてみたものの、どうやって別のメソッドを呼び出せばいいのか分からない
そんなところで手が止まってしまう方もいると思います。

  • 同じコントローラ内で別のメソッド(関数)を呼び出す方法がわからない
  • 同じ処理を繰り返し書いてしまい、コードが汚くなってしまう

呼び出す方法としては、メソッド内で$this->XXX();(呼び出したいメソッド名)を使うことです。
これにより以下の恩恵が受けられます。

  • 初期表示時に別メソッドを使用することで処理ごとで管理することが簡単になる
  • 再利用しやすいコードになる
  • コードがすっきりする(保守性が上がる)

実際に初期表示からDBの検索結果を表示する機能を作成し、PGレベルで解説していきますので是非参考にしてください。

目次

実装

実装する流れ

  • web.phpに今回使用するルートを定義する
  • controllerに初期表示用のメソッドを準備する
  • controllerの検索時用のメソッドを準備する
  • controllerの検索時用のメソッドでデータを検索する(SELECT)
  • 検索結果を画面に表示する

web.php

まずは、ルーティングの設定です。
初期表示時には「gettest」ルートにアクセスされる想定をしています。

「/blog」と「/blog/search」のルートを作成しましょう。

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BlogController;

Route::get('/', function () {
    return view('welcome');
});

//  今回使用するルート-----------------------------------------------------------------------------------
Route::get('/blog', [App\Http\Controllers\BlogController::class, 'gettest'])->name('gettest'); //  初期表示
Route::get('/blog/search', [App\Http\Controllers\BlogController::class, 'searchUser'])->name('searchUser'); //  検索
//  ---------------------------------------------------------------------------------------------------

また、今回はDBとしてusersテーブルを使用しています。

usersテーブル

controller

searchUserメソッドを作成し、SQLでデータをSELECT、ビューを返すようにします。
そしてgettestメソッドで$this->searchUserとし、別メソッドを呼び出して結果的にビューが返るという流れになります。

この「$this->XXX」はクラス内変数や、関数を使用するときによく使われているもので、いい感じに使うとかなりコードもすっきりし、メンテナンス性が向上します。
実務(現場)では、クラスを使用しているときやフレームワークを使用しているときに必ずと言っていいほど使用されているので頭の片隅に置いておくと後で幸せになれると思います!

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\users;

class BlogController extends Controller
{
    public function gettest(Request $request) {
        //  初期値を設定
        $forms = Array(
            'id'   => 1,
            'name' => '山田',
            'age'  => 15,
        );

        //  検索メソッドを実行
        return $this->searchUser($request, $forms);
    }

    //  普通に検索された時は直接このメソッドが実行される
    public function searchUser(Request $request, $forms = array()) {
        //  検索条件を取得、検索後のフォームの値を保持
        if (count($forms) == 0) {
            $forms = [
                'id'   => $request->input('id'),
                'name' => $request->input('name'),
                'age'  => $request->input('age')
            ];
        }

        //  検索
        $query = users::query();
        if ($forms['id'] != '') {
            $query->where('id', '=', $forms['id']);
        }
        if ($forms['name'] != '') {
            $query->where('name', 'LIKE', $forms['name'].'%');
        }
        if ($forms['age'] != '') {
            $query->where('age', '>=', $forms['age']);
        }
        $users = $query->get();

        return view('test', [
            'forms' => $forms,
            'users' => $users
        ]);
    }
}

blade

bladeは特に気を付けるべきことはないのでそのままforeachで変数を展開しましょう。

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Laravel</title>

        <!-- Fonts -->
        <link rel="preconnect" href="https://fonts.bunny.net">
        <link href="https://fonts.bunny.net/css?family=figtree:400,600&display=swap" rel="stylesheet" />
    </head>
    <body>
        <h3>テストフォーム</h3>
        検索条件
        <form action="{{ route('searchUser') }}" method="GET">
            <table>
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>名前</th>
                        <th>年齢</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>
                            <input type="text" name="id" value="{{$forms['id']}}">
                        </td>
                        <td>
                            <input type="text" name="name" value="{{$forms['name']}}">
                        </td>
                        <td>
                            <input type="text" name="age" value="{{$forms['age']}}">
                        </td>
                    </tr>
                </tbody>
                <tfoot>
                    <tr>
                        <td colspan="3">
                            <input type="submit" value="送信">
                        </td>
                    </tr>
                </tfoot>
            </table>
        </form>

        <br>
        検索結果
        @if (count($users) > 0)
        <table border="1">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>名前</th>
                    <th>年齢</th>
                </tr>
            </thead>
            <tbody>
                @foreach ($users as $user)
                <tr>
                    <td>{{$user->id}}</td>
                    <td>{{$user->name}}</td>
                    <td>{{$user->age}}</td>
                </tr>
                @endforeach
            </tbody>
        </table>
        @endif
    </body>
</html>

最後に、urlにルート「/blog」として、コントローラの「gettest」メソッドを呼び出します。
実装後の画面イメージは以下になります。

初期表示から検索を実行
初期表示後、普通に検索

まとめ

今回はコントローラ内から別メソッドを呼び出す方法について解説しました。
これを活かせるようになるとSELECT用のSQLを別メソッドとしたりさらに細分化して管理しやすくなります。
また、Repositoryディレクトリを使用したSQLの管理方法についてもこちらの記事で紹介してますので合わせて読んでみてください。
Laravel query()を使用してクエリの可読性を上げる

  • URLをコピーしました!
目次