ユーザーの登録は、重複回避ー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>
次回は、ログインの方を深く見てみましょう。
メルマガ購読の申し込みはこちらから。