プロジェクト開始時に作成されるファイル
Userモデル
プロジェクトを作成すると、app
ディレクトリー下にUser.php
が作成される。
Userモデルの内容についてはこちらを参照。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php namespace App; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use Notifiable; // マスアサインメントの対象となる属性 protected $fillable = [ 'name', 'email', 'password', ]; // 秘匿する属性 protected $hidden = [ 'password', 'remember_token', ]; // データベース読み込み時にキャストする属性 protected $casts = [ 'email_verified_at' => 'datetime', ]; } |
コントローラー
プロジェクトを作成すると、Controllers/Auth
ディレクトリー下に以下の認証用コントローラー群が自動的に作成される。
1 2 3 4 5 6 7 8 |
[vagrant@localhost laravel_photo]$ ls app/Http/Controllers/Auth/ -Al 合計 24 -rw-rw-r--. 1 vagrant vagrant 1024 5月 12 05:47 ConfirmPasswordController.php -rw-rw-r--. 1 vagrant vagrant 667 5月 12 05:47 ForgotPasswordController.php -rw-rw-r--. 1 vagrant vagrant 1002 5月 12 05:47 LoginController.php -rw-rw-r--. 1 vagrant vagrant 1950 5月 12 05:47 RegisterController.php -rw-rw-r--. 1 vagrant vagrant 844 5月 12 05:47 ResetPasswordController.php -rw-rw-r--. 1 vagrant vagrant 1130 5月 12 05:47 VerificationController.php |
ルーティング設定
ユーザー認証のためのルーティング
プロジェクト作成後にUserモデルと必要なコントローラーはLaravelにより作成されるが、ルーティングは設定が必要になる。
ルーティングファイルに以下の1行を記載すると、ユーザー認証用の各種ルーティングがまとめて定義される。
1 |
Auth::routes(); |
ルーティングリスト
関係するルーティングは以下の通りで、ログイン関係とユーザー登録関係が定義されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[vagrant@localhost laravel_photo]$ php artisan route:list +--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+ | Domain | Method | URI | Name | Action | Middleware | +--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+ | | GET|HEAD | / | | Closure | web | | | GET|HEAD | api/user | | Closure | api,auth:api | ..... | | GET|HEAD | login | login | App\Http\Controllers\Auth\LoginController@showLoginForm | web,guest | | | POST | login | | App\Http\Controllers\Auth\LoginController@login | web,guest | | | POST | logout | logout | App\Http\Controllers\Auth\LoginController@logout | web | | | GET|HEAD | password/confirm | password.confirm | App\Http\Controllers\Auth\ConfirmPasswordController@showConfirmForm | web,auth | | | POST | password/confirm | | App\Http\Controllers\Auth\ConfirmPasswordController@confirm | web,auth | | | POST | password/email | password.email | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail | web | | | GET|HEAD | password/reset | password.request | App\Http\Controllers\Auth\ForgotPasswordController@showLinkRequestForm | web | | | POST | password/reset | password.update | App\Http\Controllers\Auth\ResetPasswordController@reset | web | | | GET|HEAD | password/reset/{token} | password.reset | App\Http\Controllers\Auth\ResetPasswordController@showResetForm | web | ..... | | GET|HEAD | register | register | App\Http\Controllers\Auth\RegisterController@showRegistrationForm | web,guest | | | POST | register | | App\Http\Controllers\Auth\RegisterController@register | web,guest | +--------+-----------+------------------------+------------------+------------------------------------------------------------------------+--------------+ |
ビューの作成
自動作成の場合
php artisan ui vue --auth
コマンドでユーザー認証に必要なビューを作成- 作成されるビューは
resources/views/auth
ディレクトリー下に配置
カスタムビュー作成の場合
authディレクトリーの作成
resources/views
ディレクトリー下にauth
ディレクトリーを作成- 作成したauthディレクトリー下に必要なビューを定められたファイル名と内容で作成
登録用フォームビューの作成~register.blade.php
auth
ディレクトリー下に、以下フォームを含む内容でregister.blade.php
を作成。ビュー名はLaravelが生成するコントローラーで想定されているされるため、これに合わせる必要がある。
たとえばユーザー登録フォームのビュー名はRegisterController
でuse
されているRegistersUsers
トレイトのshowRegistrationForm()
メソッドにおいて、'auth.register'
として呼ばれる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<form method="post" action="{{ route('register') }}"> @csrf <div> <label>ユーザー名: <input type="text" name="name"></label> </div> <div> <label>メールアドレス: <input type="email" name="email"></label> </div> <div> <label>パスワード: <input type="password" name="password"></label> </div> <div> <label>パスワード: <input type="password" name="password_confirmation"></label> </div> <div> <input type="submit" value="登録"> </div> </form> |
ブラウザーからURL:ドメイン名/register
でアクセスすると以下のようなフォームが表示される。
カスタマイズしていない状態で登録ボタンを押すと、URL:ドメイン名/home
にリダイレクトされる(後述のように、そのままでは404エラーになる)。
ログインフォームビューの作成~login.blade.php
auth
ディレクトリー下に、以下のフォームを含む内容でlogin.blade.php
を作成。
1 2 3 4 5 6 7 8 9 10 11 |
<form method="post" action="{{ route('login') }}"> <div> <label>メールアドレス: <input type="email" name="email"></label> </div> <div> <label>パスワード: <input type="password" name="password"></label> </div> <div> <input type="submit" value="ログイン"> </div> </form> |
ブラウザーからURL:ドメイン名/login
でアクセスすると以下のようなフォームが表示される。
カスタマイズしていない状態で登録ボタンを押すと、URL:ドメイン名/home
にリダイレクトされる。
コントローラー設定
ログイン後の画面遷移
たとえばユーザーログイン後のトップページを'posts/index'
とする。
デフォルト設定~404エラー
カスタマイズしていない状態では以下の様になっているが、このままログインすると404エラーとなる。
- ルーティングファイル→特に設定なし
- コントローラー
1protected $redirectTo = RouteServiceProvider::HOME;
このときブラウザーのURL表示はhttp://localhost:3000/home
となっている。
方法1~コントロールファイルを変更
以下の様に$redirectTo
の定義を編集すると、意図したページに遷移する。
1 2 3 4 5 |
protected $redirectTo = 'posts/index'; または protected $redirectTo = 'posts'; |
方法2~ルーティングファイルに追加
コントローラーが以下の様に生成直後の状態で・・・
1 |
protected $redirectTo = RouteServiceProvider::HOME; |
ルーティングファイルに以下の1行を追加する。
1 |
Route::get('home', 'PostController@index'); |
なお、上記をルーティングファイルに追加すれば、コントローラーの定義は以下でもよい。
1 |
protected $redirectTo = 'home'; |
ルート名は使えない
ルート名が設定されていても、以下の表現はエラーになる(Constant expression contains invalid operations)。
1 |
protected $redirectTo = route('posts.index'); |
ユーザー登録後の画面遷移
RegisterController
でもデフォルトで以下の様に定義されている。
1 |
protected $redirectTo = RouteServiceProvider::HOME; |
LoginController
と同じようにルーティング設定をすることで、ユーザー登録後の遷移先を設定することができる。
ユーザー認証処理の詳細
ユーザー登録処理の内容、ログイン処理の内容についてはそれぞれのリンクを参照。
2038年問題対応
Laravelでモデルの雛形を生成する場合、MySQLだと作成日時と更新日時のtimestamp
型の2038年問題が内包される。
database/migrations
ディレクトリー下のマイグレーションファイル、...create_users_table.php
のtimestamps
をdatetime
型に修正しておくべき。
ログアウト処理