前回では、入力画面で投稿した入力値やバリデーションエラーを画面に表示するために、セッションを利用してそれらの値がキープされることを知りました。今回はそれらがどのようにコントローラで指示されるかを見てみます。

Laravelの認証パッケージで提供されるものは、より複雑なので簡単な会員登録のコントローラをここでは使います。


namespace App\Http\Controllers;

use App\User;

use Illuminate\Http\Request;

class RegisterController extends Controller
{
    /**
     * Create
     *
     * @return \Illuminate\View\View
     */
    public function create()
    {
        return view('auth.register');
    }

    /**
     * Store
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function store(Request $request)
    {
        $rules = [
            'name'                  => 'required',
            'email'                 => 'required|email',
            'password'              => 'required|confirmed',
            'password_confirmation' => 'required',
        ];

        $request->validate($rules);

        User::create($request->all);

        return redirect()
            ->route('login')
            ->with('status', '新規作成完了');
    }
}

34行目の$request->validate($rules)のコードが、バリデーションエラーが起こったときに、入力値やエラーをセッションに一時的に保存する作業をすべてやってくれるのですが、これではシンプルすぎ(もちろん良いことですが)で説明のしようがないので、以下のように拡張したコードに変えてみます。

...
        $validator = validator($request->all(), $rules); // バリデーションを実行

        if ($validator->fails()) { // バリデーションエラーがあるなら、
            return back()   // 前の画面にリダイレクト
                ->withInput() // セッション(_old_input)に入力値すべてを入れる
                ->withErrors($validator); // セッション(errors)にエラーの情報を入れる
        }
...

上でコメントを入れましたが、back()にチェーンされた、withInput()withErrors()の関数が入力値とエラーをセッションに保存してくれます。

withInput()の引数として、配列関数を指定することもできます。例えば、

...
            return back()
                ->withInput($request->except('email')) // email以外の入力値を保存
                ->withErrors($validator);
...

さらに、入力値やエラーと関係ない値も、with()でセッションに保存して、次の画面で使用も可能です。

...
            return back()
                ->withInput($request->except('email'))
                ->with('error', '入力エラーがあります')
                ->with(['more' => 'メッセージ', 'more2' => 'メッセージ2']);
...

デバッグバーで見ると、セッションに保存されていることがわかります。

with()で渡した値は、ブレードでは、session()ヘルパーを利用して、

@if (session('error')) 
    <div class="alert alert-danger">{{ session('error') }}</div>
@endif

のように使えます。

By khino