役割が違うvalidation HTML input タグとFormRequestについて

  • URLをコピーしました!

入力フォームを作成します。そこには「名前」と「身長」と「生年月日」と「ブログのURL」を入力することができるとしましょう!
さらっとサンプルを作成すると、こんな感じです。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>入力フォームサンプル</title>
    <style>
        .form-input {
            margin: 10px;
        }
    </style>
</head>
<body>
    <h1>プロフィール登録</h1>

    <form action="">
        <div class="form-input">
            <label for="namae">名前</label><br>
            <input type="text" name="namae" id="namae"><br>
        </div>
        <div class="form-input">
            <label for="sintyou">身長</label><br>
            <input type="text" name="sintyou" id="sintyou"> cm
        </div>
        <div class="form-input">
            <label for="tanjoubi">誕生日</label><br>
            <input type="text" name="tanjoubi" id="tanjoubi">
        </div>
        <div class="form-input">
            <label for="blogurl">ブログURL</label><br>
            <input type="text" name="blogurl" id="blogurl">
        </div>
        <button>登録</button>
    </form>
</body>
</html>

この内容を受け取る Laravel 側の FormRequest はこんな感じになります。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ProfileEditRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * リクエストに適用するバリデーションルールを取得
     *
     * @return array
     */
    public function rules()
    {
        return [
            'namae'    => 'required|string|max:255',
            'sintyou'  => 'required|numeric',
            'tanjoubi' => 'required|date_format:Y/m/d',
            'blogurl'  => 'nullable|url',
        ];
    }
}

これで、まったくもって問題なくシステム開発ができます!
今日は、HTML側にも validation をつけたらどうなんだろう?って話しをしたいと思います。

HTMLの内容を以下のように変えます。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>入力フォームサンプル</title>
    <style>
        .form-input {
            margin: 10px;
        }
    </style>
</head>
<body>
    <h1>プロフィール登録</h1>

    <form action="">
        <div class="form-input">
            <label for="namae">名前</label><br>
            <input type="text" name="namae" id="namae" required><br>
        </div>
        <div class="form-input">
            <label for="sintyou">身長</label><br>
            <input type="number" name="sintyou" id="sintyou" step="0.1" required> cm
        </div>
        <div class="form-input">
            <label for="tanjoubi">誕生日</label><br>
            <input type="date" name="tanjoubi" id="tanjoubi" required>
        </div>
        <div class="form-input">
            <label for="blogurl">ブログURL</label><br>
            <input type="url" name="blogurl" id="blogurl">
        </div>
        <button>登録</button>
    </form>
</body>
</html>

いいことがたくさん増えます!
まず、HTML4の時代なら、必須チェックとか日付のフォーマットチェックをするには jQuery などを使ってやる必要がありました。しかし、今は input type='~' という内容が増えたので、パターンを把握しておけばかなり便利に使えるようになると思います。

しかし!そうすると、FormRequest クラスで validation する必要がないのでは?と思うかたがいらっしゃると思います。
これは、どの部分でのチェックになるかというお話しになります。

  • HTML で指定 → POST 前に validation チェックしてくれる
  • FormRequest で指定 → POST 直後で、メインの処理に入る前に、validation チェックしてくれる
  • 最後に、データベースのカラムの型でチェックが入る

と3段階になります。

通常は使わないと思いますが、POST や GET はツールを使っても行えます。もちろんHTTPリクエストのテストでも実行できます。HTMLで input type='date' などと指定すると、日付はきちんと入力されます。 required を設定すれば、必須もチェックできます。しかしそれは POST されるかどうかではないです。POSTの内容を保証していません。あくまでも form タグの中のフォームが、型があっているか確認してくれていることにすぎないのです。

ですから、何度だってチェックしてもらえたほうがいいです!ということで、HTMLで input type='~' ぜひ使っていきましょう!

ツチノコテクノロジーでは一緒に働く仲間を募集しています!

完全リモートで働きたい方へ!

詳しくは以下をご覧ください。

ツチノコテクノロジー採用サイト

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ツチノコテックアカデミアの記事は、社内で誰かが質問してくれたことに回答したときに、ついでに記載しています!(^^)/
みんなの悩みを共有すれば、きっと誰かの役に立つと信じて更新しています!

目次