ユーザーの登録は、重複回避ーDB重複エラーで、一部分紹介しました。ここでは、一部と言わず全部をカバーしてみましょう。しかも、ララベル5.1がサンプルとして提供するプログラムをもとに。
ララベルが提供するユーザー認証のサンプルは、ララベルの作者、テイラーが作成したプログラムでありますが、すべてのパーツが揃っていて、親切な説明がなされているというものではありません。コントローラで使用するブレイドのファイルもないし、ブレイドのファイル名やパス名もドキュメントにはありません。また、プログラムでは、トレイトが多用されているために、まず参照されているファイルを見て、次の参照ファイルを見て、さらに次へ・・という、理解には探偵作業が必要です。ちょっと腰を据えて取り組んでみましょう。
まず、最前線のファイルのリストから、
app/Http/routes.php app/Http/Controllers/Auth/AuthController.php
そう、これだけなのです。もちろんブレイドファイルも作成する必要ありますが、これだけでユーザーの登録とログイン画面ができてしまいます。それぞれ中身を見てみましょう。
まず、routes.php
。これは、画面でアクセスするプログラムの回路図のようなもので、ここでURLとコントローラを結びつけます。
// 会員登録 Route::get('auth/register', 'Auth\AuthController@getRegister'); Route::post('auth/register', 'Auth\AuthController@postRegister'); // ログイン・ログアウト Route::get('auth/login', 'Auth\AuthController@getLogin'); Route::post('auth/login', 'Auth\AuthController@postLogin'); Route::get('auth/logout', 'Auth\AuthController@getLogout'); //会員登録後、ログイン後に飛ばされるホーム画面 Route::get('/home', function () { return view('auth.home'); });
次に、AuthController.php
。このひとつで会員登録とログインをやってしまいます。いったいどうやっているのか見てみましょう。(オリジナルの英語のコメントはスペースのために省いています)
namespace App\Http\Controllers\Auth; use App\User; use Validator; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\ThrottlesLogins; use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; class AuthController extends Controller { use AuthenticatesAndRegistersUsers, ThrottlesLogins; public function __construct() { // ログアウト以外は、guestのミドルウェアを通す。 // ここですでに認証されているかどうかを判断。 $this->middleware('guest', ['except' => 'getLogout']); } // 入力チェックのルーチン protected function validator(array $data) { return Validator::make($data, [ 'name' => 'required|max:255', 'email' => 'required|email|max:255|unique:users', 'password' => 'required|confirmed|min:6', ]); } // DBにレコードを作成。 protected function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); } }
これを最初に見て思うのは、routes.php
で使用されているコントローラのメソッドはどこにある??
getRegister
postRegister
getLogin
postLogin
getLogout
これらのメソッドのことです。もしかして、Controller
のクラスを継承しているので、Controller.php
で定義されている?
しかし、そちらはもっと短い(以下)!
namespace App\Http\Controllers; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Routing\Controller as BaseController; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; abstract class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; }
それならいったいどこで?と探偵作業の始まりです。
となると、AuthController.php
の13行目のトレイト?
use AuthenticatesAndRegistersUsers
見てみましょう。
namespace Illuminate\Foundation\Auth; trait AuthenticatesAndRegistersUsers { use AuthenticatesUsers, RegistersUsers { AuthenticatesUsers::redirectPath insteadof RegistersUsers; } }
またしてもトレイト!
use AuthenticateUsers, RegisterUsers
RegisterUsers.php
を見てみましょう(ログイン関連は、AuthenticateUsers.php
ですがそれは次回に)。
namespace Illuminate\Foundation\Auth; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; trait RegistersUsers { use RedirectsUsers; public function getRegister() { return view('auth.register'); } public function postRegister(Request $request) { $validator = $this->validator($request->all()); if ($validator->fails()) { $this->throwValidationException( $request, $validator ); } Auth::login($this->create($request->all())); return redirect($this->redirectPath()); } }
これですね、探していたのは!
getRegister
では、auth.register
がブレードの場所ということわかります。つまり、
resources/views/auth/register.blade.php
を作成すれば、会員登録の画面ができあがりです。
postRegister
の関数では、先にAuthController.php
で定義した、validator
とcreate
がここで参照されていますね。
Auth::login($this->create($request->all()));
ここでは、DBレコードを作成して返される、User
のインスタンスをもとに、ログインも行っていしまいます。つまり、登録したら自動ログインして、ホームにリダイレクトということです。
しかし、いったいどこへリダイレクト?
それも、もちろんRedirectUsers
のトレイトなのです。
namespace Illuminate\Foundation\Auth; trait RedirectsUsers { public function redirectPath() { if (property_exists($this, 'redirectPath')) { return $this->redirectPath; } return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home'; } }
デフォルトは、/homeですね。また、Authocontroller
において、redirectTo
の上書きも可能ということです。
最後に、登録画面のブレードファイルには、以下のようなHTMLがあればOKです。
<form method="post" action="auth/register"> {!! csrf_field() !!} <div> ログイン: <input type="email" name="email" value="{{ old('email') }}" required autofocus> </div> <div> パスワード: <input type="password" name="password" required> </div> <div> パスワードの確認: <input type="password" name="password_confirmation" required> </div> <div> 名前: <input type="text" name="name" value="{{ old('name') }}" required> </div> <div> <button type="submit">保存</button> </div> </form>
次回は、ログインの方を深く見てみましょう。
メルマガ購読の申し込みはこちらから。