コントローラの内容を”基礎から”読もう

株式会社WOWNエンジニアチームです。

前回までの内容は、ユーザーが操作する画面(ビュー)とサーバーの情報をどうやって連携するかのお話でした。
非常に簡単な内容ではありましたが、APIエンドポイントを使ってコントローラを呼び出し、ステートを使ってその内容を表示するまでの話です。

今回から、コントローラの内容に触れ始めます。

コントローラって何だっけ?

おさらいになりますが、コントローラの役割は、ビューやモデルの動作を仲介するものでした。

レストランのウェイターを想像してみてください。レストランのお客さまがシェフに料理を頼むには、ウェイターに欲しい料理を伝えます。その後、シェフが作った料理をお客さまに届けるのもまたウェイターです。
ウェイター自体が料理を作ったり食べたりすることはありませんが、レストランのシステムには必要なものです。同じことをWebシステムのコントローラが行なっています。

 

コントローラメソッドの内容は、例えば以下のようなものです。


    public function store(Request $request): RedirectResponse
    {
        $request->validate([
            'token' => 'required',
            'email' => 'required|email',
            'password' => ['required', 'confirmed', Rules\Password::defaults()],
        ]);

        // Here we will attempt to reset the user's password. If it is successful we
        // will update the password on an actual user model and persist it to the
        // database. Otherwise we will parse the error and return the response.
        $status = Password::reset(
            $request->only('email', 'password', 'password_confirmation', 'token'),
            function ($user) use ($request) {
                $user->forceFill([
                    'password' => Hash::make($request->password),
                    'remember_token' => Str::random(60),
                ])->save();

                event(new PasswordReset($user));
            }
        );

        // If the password was successfully reset, we will redirect the user back to
        // the application's home authenticated view. If there is an error we can
        // redirect them back to where they came from with their error message.
        if ($status == Password::PASSWORD_RESET) {
            return redirect()->route('login')->with('status', __($status));
        }

        throw ValidationException::withMessages([
            'email' => [trans($status)],
        ]);
    }

Laravelで用意してくれるユーザー認証機能のプリセット(Sanctum)の内容を一部抜粋しました。
何やらいろんな内容が書かれていますね。プログラムを読み慣れていないと頭がクラクラする内容かもしれません。

 

 

もう少し簡単に

上記のコード例ではちょっと複雑なので、極限まで内容を簡単にしたコントローラの例を用意しました。


public function hello()
{
    return 'こんにちは';
}

必要最低限の内容のコントローラです。

 

ほとんどのコントローラで必ず行う動作がひとつだけあります。「return {内容}」という処理を実行すると、コントローラを呼び出した場所に{内容}を出力して終了」です。

このコントローラの例では、returnで文字列の’こんにちは’を返しています。ですからこのコントローラをAPIなどから呼び出すと、呼び出したビューファイルや他のプログラムで「こんにちは」という文字列を受け取ることができます。
レストランの例で言えば、「店に入ると、必ず決まった料理が1品出てくる」ような状態です。

vegetable dish in white ceramic bowl

returnで返すものはコントローラの用途によって様々です。

サーバーからユーザー情報を取得したいなら、ユーザー情報(オブジェクト)をreturnで返すでしょうし、
データの操作がしたいなら、成功したか失敗したかのステータスコード(200 successや404 not foundなど、サーバーの状態を示す3桁の数値)を返すことで端的に状態を伝えます。
関数をreturnで指定することで、コントローラから別のプログラムを起動することもできます。

 

もう少しコントローラらしくしよう

さすがに「こんにちは」という文字列が返るだけのコントローラではプログラムと呼べないので、現在の時刻に合わせて挨拶を変えてくれるように内容を書き加えましょう。

public function hello()
{
    // 現在の時刻を取得
    $now = Carbon::now();

    if ($now->hour < 12) {
        return 'おはよう'; 
    } else if ($now->hour < 18) {
        return 'こんにちは';
    } else {
        return 'こんばんは';
    }
}

Laravelが持つCarbonというライブラリ(出来合いの関数)を使って現在の時刻を取得した後、

  • 0時〜12時の間だったら、’おはよう’
  • 12時〜18時の間だったら、’こんにちは’
  • 18時〜24時の間だったら、’こんばんは’

の、いずれかを判断して文字列を返してくれます。レストランの例で言えば、「店に入った時間帯に応じて、モーニングかランチかディナーかを判断して料理を出してくれる」状態です。少しだけプログラムらしくなりました。

 

returnから内容を読む

これを念頭に難しい方の例のコントローラを改めて見ると、returnの部分では「return redirect()->…」と書いていますね。
redirect(転送)、つまり特定のページに遷移させる関数です。「パスワードリセットに成功したら、ログインページに遷移」という動作を行うコントローラなわけです。SNSなどのWebシステムで馴染みのある動作ではないでしょうか?

MacBook Pro showing programming language

厳密に言えば、returnがひとつもないコントローラでも動作はします
ですが、動作が成功したのか失敗したのか、途中のプログラムでエラーが起きたのかなど、他のプログラムや最終的に扱うユーザーが状況を判断できなくなってしまうので、returnをひとつも書かないことはほとんどありません
プログラムを作成するエンジニアの私たちからしても、「最終的にどうなるのか(どういうデータが渡るのか)」は、プログラムを書き加えたり改修したりする際のヒントや指針にもなります。

 

さて、これで最低限のコントローラの読み方が分かりました。
次回、「レストランのウェイターに注文を伝えるには?」です。

WEB制作・ITに関するお悩みや
ご質問等お気軽にご相談ください

contact

この記事の著者

コメントする

関連記事