読者です 読者をやめる 読者になる 読者になる

tanaka's Programming Memo

プログラミングについてのメモ。

Laravel5.3でSentinelを利用する(4)アクティベーション

PHP Sentinel Laravel

前へ | 次へ

ユーザー登録ができたので、アクティベーションコードを確認して、ユーザーを有効にする処理を実装します。

(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 に対応していないので、アクティベーションしたユーザーでのログインはできません。次はこれを対応させましょう。



前へ | 次へ