ユーザーの登録は、重複回避ー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で定義した、validatorcreateがここで参照されていますね。

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>

次回は、ログインの方を深く見てみましょう。

By khino