More Related Content Similar to 認証機能で学ぶ Laravel 5 アプリケーション Similar to 認証機能で学ぶ Laravel 5 アプリケーション (20) More from Masashi Shinbara More from Masashi Shinbara (14) 認証機能で学ぶ Laravel 5 アプリケーション7. こんな機能も
(c) 2015 Masashi Shinbara @shin1x1
• Cookieトークンによる自動ログイン
(Remeber me)
• Basic認証(要実装)
• ソーシャル認証(要実装 / Twitter等)
12. Controller Method
(c) 2015 Masashi Shinbara @shin1x1
• HTTPメソッド + パス
• GET /auth/register
=> getRegister()
• POST /auth/register
=> postRegister()
13. Routing - auth
(c) 2015 Masashi Shinbara @shin1x1
Method URI Action
GET¦HEAD /auth/register AuthController@getRegister
POST /auth/register AuthController@postRegister
GET¦HEAD /auth/login AuthController@getLogin
POST /auth/login AuthController@postLogin
GET¦HEAD /auth/logout AuthController@getLogout
14. Routing - password
(c) 2015 Masashi Shinbara @shin1x1
Method URI Action
GET¦HEAD /password/email PasswordController@getEmail
POST /password/email PasswordController@postEmail
GET¦HEAD /password/reset PasswordController@getReset
POST /password/reset PasswordController@postReset
17. Controller
<?php namespace AppHttpControllersAuth;
// (snip)
class AuthController extends Controller
{
use AuthenticatesAndRegistersUsers;
public function __construct(Guard $auth, Registrar $registrar)
{
$this->auth = $auth;
$this->registrar = $registrar;
$this->middleware('guest', ['except' => 'getLogout']);
}
}
コンストラクタインジェクション
18. Controller
<?php namespace AppHttpControllersAuth;
// (snip)
class AuthController extends Controller
{
use AuthenticatesAndRegistersUsers;
public function __construct(Guard $auth, Registrar $registrar)
{
$this->auth = $auth;
$this->registrar = $registrar;
$this->middleware('guest', ['except' => 'getLogout']);
}
}
ミドルウェア(ログイン済みなら、リダイレクト)
19. Controller
<?php namespace AppHttpControllersAuth;
// (snip)
class AuthController extends Controller
{
use AuthenticatesAndRegistersUsers;
public function __construct(Guard $auth, Registrar $registrar)
{
$this->auth = $auth;
$this->registrar = $registrar;
$this->middleware('guest', ['except' => 'getLogout']);
}
}
トレイト
21. Constructor Injection
public function __construct(Guard $auth, Registrar $registrar)
{
$this->auth = $auth;
$this->registrar = $registrar;
$this->middleware('guest', ['except' => 'getLogout']);
}
$auth = Guard クラスのインスタンス
$registar = Registarクラスのインスタンス
22. Middleware
(c) 2015 Masashi Shinbara @shin1x1
• Decoratorパターン
• 適用ミドルウェアをAppHttpKernelで定義
• ミドルウェアは、次のミドルウェアを呼ぶ
• 一つの処理を行うミドルウェアを重ねていく
26. Trait
(c) 2015 Masashi Shinbara @shin1x1
• AuthControllerとPasswordController
• コンストラクタのみで、実処理はトレイトに実装
• 独自コントローラにもトレイトを再利用できる
27. Trait
public function getRegister()
{
return view('auth.register');
}
public function postRegister(Request $request)
{
$validator = $this->registrar->validator($request->all());
if ($validator->fails())
{
$this->throwValidationException(
$request, $validator
);
}
$this->auth->login($this->registrar->create($request->all()));
return redirect($this->redirectPath());
}
method
28. Trait
public function getRegister()
{
return view('auth.register');
}
public function postRegister(Request $request)
{
$validator = $this->registrar->validator($request->all());
if ($validator->fails())
{
$this->throwValidationException(
$request, $validator
);
}
$this->auth->login($this->registrar->create($request->all()));
return redirect($this->redirectPath());
}
method injection
30. Service
(c) 2015 Masashi Shinbara @shin1x1
• コントローラから起動
(コントローラ以外からの呼び出しも可)
• ビジネスロジックを実装
• 永続化などは、Eloquent(モデル)に移譲
• GuardクラスとRegistrarクラス
31. Service - Registrar
class Registrar implements RegistrarContract
{
public function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users',
'password' => 'required|confirmed|min:6',
]);
}
public function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
}
validator builder
32. Service - Registrar
class Registrar implements RegistrarContract
{
public function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users',
'password' => 'required|confirmed|min:6',
]);
}
public function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
}
business logic
33. Controller(with Trait)
public function postRegister(Request $request)
{
$validator = $this->registrar->validator($request->all());
if ($validator->fails())
{
$this->throwValidationException(
$request, $validator
);
}
$this->auth->login($this->registrar->create($request->all()));
return redirect($this->redirectPath());
}
call service
call servicecall service
36. Model(Eloquent)
class User extends Model implements AuthenticatableContract,
CanResetPasswordContract
{
use Authenticatable, CanResetPassword;
protected $table = 'users';
protected $fillable = ['name', 'email', 'password'];
protected $hidden = ['password', 'remember_token'];
}
Contract(interface)
Trait
38. まとめ
(c) 2015 Masashi Shinbara @shin1x1
• 認証実装は、良いサンプル実装
• 役割を分け、シンプルな実装を
• こうしないといけないわけじゃない
• Laravelの実装で、アーキテクチャを学ぶ