登録フォーム表示
ルーティング定義
ルーティングファイルにAuth::routes();
を記述することでユーザー認証関係のルーティングが自動設定される。その中には、以下の登録フォーム表示のルーティングも含まれている。
- メソッド:GET
- URL:
register
- アクション:
Auth\RegisterController@showRegistrationForm
- ルート名:
register
アクション
RegisterController
コントローラーはRegistersUsers
トレイトを利用していて、その中でshowRegistrationForm
アクションが定義されている。
1 2 3 4 5 6 7 8 9 10 |
..... use Illuminate\Foundation\Auth\RegistersUsers; ..... class RegisterController extends Controller { ..... use RegistersUsers; ..... } |
RegistersUsers
トレイトのshowRegistrationForm()
アクションメソッドは以下の通りで、auth.register
ビューをレンダリングしている。
auth.register
ビューは初期状態では存在しないので、コマンドで生成するかカスタムで作成する必要がある。
1 2 3 4 5 6 7 8 9 |
trait RegistersUsers { ..... public function showRegistrationForm() { return view('auth.register'); } ..... } |
フォームからのPOSTと登録実行
ルーティング定義
ルーティングファイルへのAuth::routes();
の記述によって、以下のルーティングも定義される。
- メソッド:POST
- URI:
register
- アクション:
Auth\RegisterController@register
アクション
showRegistrationForm
アクションと同じく、register
アクションもRegisterController
でuseされるRegistersUsers
トレイトで定義されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
trait RegistersUsers { use RedirectsUsers; ..... public function register(Request $request) { $this->validator($request->all())->validate(); event(new Registered($user = $this->create($request->all()))); $this->guard()->login($user); return $this->registered($request, $user) ?: redirect($this->redirectPath()); } .... } |
このアクションの動作は以下の通り。
1 |
$this->validator($request->all())->validate(); |
- マスアサインメント
$request->all()
のための$fillable
はapp\User.php
モデルで定義しておく - 入力されたフィールド群を検証する
validator()
メソッドで検証条件を定義validator()
はRegistersUsers
トレイトを利用する親元のRegisterControllers
で定義
12345678910111213class RegisterController extends Controller{.....protected function validator(array $data){return Validator::make($data, ['name' => ['required', 'string', 'max:255'],'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],'password' => ['required', 'string', 'min:8', 'confirmed'],]);}.....}- 戻り値の
Validator
インスタンスのvalidate()
メソッドで検証実行
1 |
event(new Registered($user = $this->create($request->all()))); |
RegistersUsers
トレイトを利用する親元のRegisterController
のcreate()
メソッドを呼んでデータ作成- その
User
インスタンスを与えて登録済みのイベント発行
1 |
$this->guard()->login($user); |
$user
登録後にそのユーザーでログイン- ここで現れる
$this-guard()
は\Illuminate\Auth\SessionGuard
クラスのインスタンスを返すが、かなり深掘りしないと流れを掴めない。
1 2 |
return $this->registered($request, $user) ?: redirect($this->redirectPath()); |
$this->registered()
は登録確認のようだが、同じトレイトで空で定義されている
1234protected function registered(Request $request, $user){//}- このため三項演算子の
false
側に書かれているredirect($this->redirectPath())
がreturn
の戻り値となる redirectPath()
はRegistersUsers
トレイトでさらにuse
されたRedirectsUsers
トレイトで定義されていて、redirectTo()
メソッドが定義されていれば実行$redirectTo
属性が定義されていればそこにリダイレクト- いずれでもなければ
/home
にリダイレクト
12345678910111213namespace Illuminate\Foundation\Auth;trait RedirectsUsers{public function redirectPath(){if (method_exists($this, 'redirectTo')) {return $this->redirectTo();}return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';}}
- 初期状態ではこのトレイトの親元
RegisterController
で$redirectTo
が定義されているので、この内容(RouteServiceProvider::HOME
)にリダイレクトされる