ネクストエンジン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を使用するページ作成