ユーザー登録ができたので、アクティベーションコードを確認して、ユーザーを有効にする処理を実装します。
(2016/12/21 テストにwantToを追加)
テストの作成
まずは、アクティベーションをするテストコードを作成しましょう。
- ターミナルから以下を実行して、 ActivationUserCest.php を作成
composer exec codecept g:cest functional ActivationUser
- tests/functional/ActivationUserCest.php をエディターで開いて、以下のコードに書き換える(2016/12/21 expectをwantToに書き換え)
<?php class ActivationUserCest { private $code = ""; // ユーザーを登録 private $cre = [ 'name' => 'アクティベーション', 'email' => 'act@test.com', 'password' => 'password' ]; public function _before(FunctionalTester $I) { $user = Sentinel::register($this->cre); // アクティベーション作成 $act = Activation::create($user); $this->code = $act->code; } public function _after(FunctionalTester $I) { } // tests public function tryToTest(FunctionalTester $I) { // コード違い $I->wantTo(' アクティベーションコード違いエラーの確認.'); $url = url('activate', [base64_encode($this->cre['email']), 'error']); $I->amOnPage($url); $I->see(trans('sentinel.invalid_activation_params'), '.alert-danger'); // 成功チェック $I->wantTo(' アクティベーション成功の確認.'); $url = url('activate', [base64_encode($this->cre['email']), $this->code]); // リンクを amOnPage で表示 $I->amOnPage($url); // 登録完了のメッセージをチェック $I->see(trans('sentinel.activation_done')); // すでにアクティベーション済みの場合は、普通にログイン画面へ $I->wantTo(' アクティベーション済みはログイン画面へ.'); $url = url('activate', [base64_encode($this->cre['email']), 'no']); $I->amOnPage($url); $I->dontSee(trans('sentinel.activation_done')); $I->dontSee(trans('sentinel.invalid_activation_params')); // 失敗チェック $I->wantTo(' アクティベーションメールもアクティベーションコードも違う時の確認.'); $url = url('activate', [base64_encode('nobody@test.com'), 'no']); $I->amOnPage($url); $I->see(trans('sentinel.invalid_activation_params'), '.alert-danger'); } }
npm test でテストを走らせるとエラーになります。これから実装を進めてテストが完了するようにします。
アクティベーション用のルートを作成
メールからは、 activate/{メールアドレス}/{アクティベーションコード} という形式でアクティベーション用のアクセスがあります。これを受け取って、処理するためのルートを追加します。
- routes/web.php をエディターで開く
- registerの登録の下に、以下を追加
// アクティベーション Route::get('activate/{email}/{code}', 'Sentinel\ActivateController@activate');
アクティベーションの実行
ルートを定義したので、それを処理するコントローラーを作成します。
ルート内のパラメーター({email}と{code})は、Requestに渡されるので、$request->emailや$request->codeのようにアクセスすることができます。
- ターミナルで以下を実行
php artisan make:controller Sentinel/ActivateController
- app/Http/Controller/Sentinel/ActivateController.php をエディターで開く
- ファイルの最初の方に、以下の use を追加
use Activation; use Sentinel;
- 以下の activate() メソッドをクラスに追加する
/** * アクティベーション */ protected function activate(Request $request) { // ユーザーを取得する $user = Sentinel::findByCredentials(['email' => base64_decode($request->email)]); if (is_null($user)) { return redirect('login')->with(['myerror' => trans('sentinel.invalid_activation_params')]); } // アクティベーション済みだった場合、そのまま戻る if (Activation::completed($user)) { return redirect('login'); } // アクティベーションを実行する if (!Activation::complete($user, $request->code)) { return redirect('login')->with(['myerror' => trans('sentinel.invalid_activation_params')]); } return redirect('login')->with(['info' => trans('sentinel.activation_done')]); }
必要なメッセージの追加
アクティベーション関連のメッセージを追加します。
- resources/lang/ja/sentinel.php をエディターで開いて、以下を追加
// アクティベーション関連 'invalid_activation_params' => 'アクティベーションの情報が一致しませんでした。', 'activation_done' => 'ユーザー登録を完了しました。ログインして、サービスをご利用ください。',
以上で、アクティベーション処理は完成です。 npm test でテストを走らせると、「OK (3 tests, 14 assertions)」が表示されて成功します。
実際に動きを確認する場合は、 http://localhost:8000 を開いて、登録の流れを試してください。また、 http://localhost:8000/activate/bademail/badcode にアクセスすると、アクティベーションのパラメーターが不正である旨、表示されます。
ユーザーは有効にできましたが、まだログインが Sentinel に対応していないので、アクティベーションしたユーザーでのログインはできません。次はこれを対応させましょう。