ルーティングの設定(web.php)
Route::resource('user-account', UserAccountController::class)->only(['create', 'store']);
コマンドでコントローラーを作成
php artisan make:controller UserAccountController
use App\Http\Controllers\UserAccountController; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class UserAccountController extends Controller { public function create() { return inertia('UserAccount/Create'); } public function store(Request $request) { $user = User::create($request->validate([ 'name' => 'required', 'email' => 'required|email|unique:users', 'password' => 'required|min:8|confirmed', ])); // Laravel 10+では自動的にハッシュされるため、この行は不要 // $user->password = Hash::make($user->password); Auth::login($user); return redirect()->route('listing.index')->with('success', 'Account created'); } }
- request->validate(...) で入力値を検証
- unique:users は、すでに登録済みのメールアドレスを弾く
- confirmed は、password_confirmation フィールドと一致していることを確認するバリデーション
- Auth::login($user) で登録直後に自動ログイン
$user = User::create(...) と $user = User::make(...) の違い
User::create()
→ 「モデルの作成+保存(INSERT)」まで一気にやるメソッドです。
バリデーション済みの配列を渡すと、その内容でユーザーを作成し、すぐにデータベースに保存します。
だからこのメソッドを使うと、save()は不要です。
User::make()
→ **「モデルのインスタンスは作るが、保存はしない」**メソッドです。
まだDBに保存していない「ただのオブジェクト」を返します。
この後、save()を呼ばないとDBに反映されません。
Auth::login($user)
Auth::login($user) は、Laravel の認証機能を使って そのユーザーをログイン状態にする 処理です。
つまり、ユーザーがアカウント登録(またはログイン)した後に、ログイン済み状態にするための一行です。
具体的には何が起こっているの?
セッションにユーザー情報を保存する
Laravelは、セッションを使って「誰がログインしているか」を記録します。
Auth::login($user) を呼ぶと、その $user の情報がセッションに保存されます。
次のリクエストからはログイン状態として扱われる
例えば auth() や Auth::user() を呼ぶと、このログインした $user が取得できます。
auth()->check() は true を返します。
パスワードのハッシュ化(旧方法)
以前は以下のようにコントローラで手動でハッシュしていました。
use Illuminate\Support\Facades\Hash; $user = User::make($request->validated()); $user->password = Hash::make($user->password); $user->save();
$casts に 'password' => 'hashed' と書く方法(Laravel 10+の標準)
モデルのUser.phpに以下を記述する。
protected $casts = [ 'password' => 'hashed', ];
これだけでパスワードは自動的にハッシュ化されます。
Laravelの内部でAttributeのような仕組みが働いています。
こちらのほうがシンプルで推奨されている書き方です。