【PHPでwebアプリ:Laravel6】バリデーション応用とデータベース登録

write Webエンジニア

前回の記事では入力フォームと基本的なバリデーションを作成しました。

form

【PHPでwebアプリを作る:Laravel6】入力フォームとバリデーション編

2019年11月5日

今回はバリデーションを調整して完成させて、バリデーションを通過したデータでユーザー情報をデータベースに登録するところまでやっていきます。

バリデーション調整

メールアドレス、パスワード、ニックネームのそれぞれに必須入力のバリデートは追加しましたが、まだ他にも各項目に対して以下のチェックをする必要があります。

メールアドレス:メールアドレスとして正しい形か
パスワード:最低8文字以上

パスワードの8文字以上は勝手に決めた数字ですが、1文字のパスワードとかを許容してしまうと意味が無いので最低何文字かはチェックした方がいいと思います。

そしてこれらの実装をすると以下のようになります。

        $validatedData = $request->validate([
            'email' => 'required|email',
            'password' => 'required|min:8',
            'nickname' => 'required',
        ]);

1つの項目に対しチェック項目を複数指定する時は|でつないで複数指定を行います。

ただしこのままではまたエラーメッセージが英語のままなので前回同様resources/lang/jp内のvalidation.phpを修正します。

emailとmin(string)のエラーメッセージを以下のように修正してみます。

'email' => ':attributeが正しい形式ではありません',
'string' => ':attributeは:min文字以上で入力してください',

これで適当な値を入力して進むときちんとチェックされてエラーメッセージが表示されることを確認できると思います。
validation

入力した値が消えるので維持させる

上の画像を見るとわかりますが、値を入れて送信すると入れておいた値が消えてしまっています。これを維持したままにできるようにしましょう。

エラーの際に入力した値をそのままにしておくには以下のようにします。

<input type="text" name="email" value="{{ old('email') }}" class="form-control">
<input type="text" name="nickname" value="{{ old('nickname') }}" class="form-control">

oldが入力した値を維持して戻ってくる部分です、パスワードは入力した値を維持しないようにそのままにしています。

入力されたデータをデータベースへ登録

とその前にそもそものデータベースですがmysqlが動いていてwhateatという名のデータベースがあるという状態とします。

まずはosのコマンドラインから直接mysqlに入って実行します。

mysql -uroot
create database whateat;
exit

これまでの記事で作成したユーザーテーブルの構造をダンプしたものを作成したwhateatに対して実行します。

mysql -uroot whateat
下の一連をコピペして実行
CREATE TABLE users (
  user_id int(11) NOT NULL auto_increment,
  mail varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  nickname varchar(255) NOT NULL,
  created_at datetime NOT NULL,
  PRIMARY KEY  (user_id)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

一連の流れの画像は以下です。
validation

設定ファイルでデータベース名を指定

laravelを設置したところに.envというファイルがあるので、そこでデータベース名を指定します(本来はパスワードも指定するべきだと思います)

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=whateat
DB_USERNAME=root
DB_PASSWORD=

これでようやくデータベースを使う準備はOKです。

データベースへの登録処理

SignupController内のaddメソッドのバリデーションを抜けた先に以下の処理を追記します。

        $data = array();
        $data['mail'] = $request->input('email');
        $data['password'] = password_hash($request->input('password'), PASSWORD_BCRYPT);
        $data['nickname'] = $request->input('nickname');
        $data['created_at'] = now();
        DB::table('users')->insert($data);

しかしここで「could not find driver」というエラーが、phpinfoで確認するとPDOがsqliteのみでmysqlが無い状態。
validation

ということでyumでphp-mysqlndをインストールしてapacheを再起動します。

yum -y install php-mysqlnd
systemctl restart httpd

これで実行するとデータが登録されるところまでは作成できました。

ログイン処理を見越してのリファクタリング

基本の流れはここまでとし、今回はユーザー登録の部分なのでこの後にログイン済みにする処理を書いていこうと思います。

今回書いた部分も調整する可能性がありますので、合わせて次の記事を参照していただければ幸いです。