#はじめに
今回、先日作成したmake:authでログイン機能を実装しました。
そこに、オリジナルのカラムを作成し充実した登録サイトを作成している時にエラーが発生しました。
createメソッドがいまいち分かっていなかったからこそ出現したエラーです。
今後このようなエラーが無いように備忘録として投稿します。
#投稿者の環境
- MacBook Pro (13-inch, 2019, Two Thunderbolt 3 ports)
- macOS Big Sur バージョン11.0.1
- Laravel Framework 6.20.7
- PHP 7.3.23
#エラーのスクショはこちらになります
###ローカルサーバー
#エラーの解説
氏名にカタカナを入力するカラムの(name_kana)デフォルト値が空白です。という意味になります。
#仮説
まず、カラム名のid
name
password
created_at
updated_at
はデータが入力されています。
しかし、他のカラムは0
で保存されています(強制的に登録しました)。
そうしたら、createメソッドで定義を忘れている可能性があるかも・・・
そう思い、調べてみました。
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'name_kana' => ['required', 'string', 'max:255'],
'gender' => ['required','boolean'],
'age' => ['required','digits:2'],
'birthday' => ['required','integer'],
'postal_code' => ['required','digits:7'],
'address' => ['required','max:800'],
'phone' => ['required','numeric','digits_between:10,11'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
}
#原因
単なるcreateメソッドに$data
を渡していなかったからです。
これではフォームに値を入力してもDBには0
で登録されることが分かりました。
以下コードを下記のように編集しました。
//省略
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'name_kana' =>$data['name_kana'], //追加
'gender' =>$data['gender'], //追加
'age' => $data['age'], //追加
'birthday' => $data['birthday'], //追加
'postal_code' => $data['postal_code'], //追加
'address' => $data['address'], //追加
'phone' => $data['phone'], //追加
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
//省略
#結果
スクショはこちらになります。ちゃんとデータが保存されています。
#最後に
createメソッドの役割をある程度理解できた出来事になりました。
また、ターミナルで簡単にログイン機能を実装できますが私を含め初心者には何でこの表示が出るの?何でデータが保存されているの?などなどの疑問が湧いてきました。初心者にとってこの辺りは非常に分かりにくいと思います。 今回の件で、ログイン機能がどのように機能し保存ができているのかをよく調べるきっかけとなったので非常に良い体験になりました。
#参考ホームページ一覧
Laravel6 ログイン機能を実装する
LaravelでMySQLへのデータ挿入時にエラーが出た場合の対処法
Laravelの認証機能をカスタマイズしたい