ネクストエンジンAPI - コントローラでAPIを使用する

ネクストエンジンAPI - コントローラでAPIを使用する

ここでは、コントローラで使用するためのネクストエンジンAPIクライアント、

Nextengine\Api\Client_Routerクラスについてご説明致します

このクラスは、APIのレスポンスによってエラー画面へリダイレクトさせることが主な役割です

そのため、Client_Routerというクラス名にしております

Client_Routerクラスは、fuel/packages/nextengine/classes/nextengine/api/client/router.phpに記述されています

また、このクラスはController_Neapiで使用されております

あわせてお読み下さい

Clientクラスとの相違点

親クラスであるClientクラスとの相違点は、大きく分けて2点あります

1. failoverメソッドでリダイレクトする

ネクストエンジンAPIからのレスポンスにエラーが含まれていると、例外がスローされます1

このとき、

  • メイン機能もしくはネクストエンジンがメンテナンス中
  • 受注の取り込み中やアクセスが集中している
  • 料金未払いによる利用停止やシステムエラー

などのエラーだった場合には、該当するエラー画面へリダイレクトします

それぞれのエラー画面は、とても簡素なHTMLになっていますアプリに合わせてコーディングし直して下さい

それ以外のエラーだった場合には、キャッチした例外を再スローします

そのため、ネクストエンジンAPIクライアントを利用している際に、該当する例外が発生したら自動的にリダイレクトされます

    protected function failover($code, $message) {
        // 親クラスがスローする例外をキャッチし、その詳細を解析する
        try {
            parent::failover($code, $message);
        } catch(NextengineApiException $e) {
            // NOTE: redirectはexitを実行するため、`break;`を書かないでも動作するが、
            //       redirectじゃない処理に変えた時に意図しないバグを防ぐためbreakを入れている
            switch($e->getCode()) {
                // メンテナンス中 => メンテナンス中です画面へリダイレクト
                case '002007':  // 現在ネクストエンジンサーバーがメンテナンス中の為、再度時間を置いてからアクセスして下さい
                case '003004':  // 現在メイン機能サーバーがメンテナンス中の為、再度時間を置いてからアクセスして下さい
                    \Response::redirect('/error/maintenance');
                    break;

                // 混み合ってます、受注取り込み中です => しばらく待ってアクセスして下さい画面へリダイレクト
                case '003001':  // 現在メイン機能サーバーが混み合っております。再度時間を置いてからアクセスして下さい
                case '003002':  // 現在メイン機能サーバーが混み合っております。再度時間を置いてからアクセスして下さい
                case '008003':  // 受注取込中のため、更新できません
                case '008007':  // 納品書印刷中の伝票があります時間を空けて再度APIを実行して下さい
                case '008010':  // 棚卸中のため、更新できません
                    \Response::redirect('/error/congestion');
                    break;

                // 支払い等の理由で利用停止、システムエラー => 営業に問い合わせてねエラー画面へリダイレクト
                case '001007':  // [xxxxx]様のネクストエンジンが、次の理由により利用停止になっています[xxxxx]
                case '002003':  // [xxxxx]様のネクストエンジンが、次の理由により利用停止になっています[xxxxx]
                case '003003':  // [xxxxx]様のメイン機能が、利用停止です
                case '999999':  // APIサーバーのシステムエラーが発生しました
                    \Response::redirect('/error');
                    break;

                default:
                    throw $e;
            }
        }
    }

2. authenticateメソッド

Controller_Authクラスにて説明いたしました

authenticateメソッドはユーザのuidを引数に取り、

  • ネクストエンジンAPIの認証処理
  • 必要であれば、企業情報、ユーザ情報を作成しDBに保存
  • ユーザモデルをネクストエンジンAPIクライアントのインスタンスにセット

という処理をします

具体的なコードは以下の通りです

    /**
     * ユーザのuidを用いて認証する
     * DB < APIの順でコストが高く、APIを使用することはなるべく避けたい
     * そのため、まずDBを見てから、仕方ない場合のみAPIを叩く形にしている
     * FIXME: 戻り値で配列を使用しているため、ややオレオレ仕様になっている
     * 
     * ```php
     * list($company, $user) = $client->authenticate($uid);
     * ```
     * 
     * @param  string $uid ユーザのuid
     * @return array [Model_Company, Model_User]のインスタンスの配列listで受け取る想定
     */
    public function authenticate($uid) {
        // APIを1回は呼ばないと、アクセストークンとリフレッシュトークンが入手できない
        $company = $this->_createCompany();
        $users = \Model_User::findBy('uid', $this->_uid);

        // uidに対応するユーザがいる場合、そのまま利用する
        if(count($users) > 0) {
            $user    = $users[0];

        // uidに対応するユーザが居ない場合、APIを叩き認証する
        } else {
            // NOTE: fキー制約の都合でcompanyが先、elseと並び順が違うのは意図的
            $user    = $this->_createUser($company->id);
        }

        $this->setUser($user);
        return array($company, $user);
    }

内部で_createCompany, _createUserメソッドがコールされていますが、

どちらもAPIからレスポンスを取得しDBに情報を保存するユーティリティのため、詳細は割愛致します

Controller_Authに記述された認証処理を変更したい際には、ご参考にして下さい


更新履歴
  • 2015/02/17: ネクストエンジンAPI - コントローラでAPIを使用するページ作成