CakePHPでJSONを吐き出すページを作る。正規版
前のは失敗でした
その1で作ったJSON用のページは間違ってました。m(__)m申し訳ないです。以下はJSONを表示するページの作り直しです。
ちなみに今回のも完成ではありません。注意して下さい。
表示するURLを決める
CakePHPのお作法的にどういったURLが正しいか分かりませんが、以下の様にきめました。
http://sample.com/api/hogeUsers/get/user_list
Configure::write('Routing.prefixes', array('admin','api'));
ルーターの設定
CakePHP2.xではJSON用のビューを使うための設定が必要らしいです。 設定その1。/app/Config/routes.phpの最後に以下を追加します。
Router::parseExtensions('json');
コントローラの作成
/app/controller/HogeUsersController.phpを作ります。
App::uses('AppController', 'Controller');
class HogeUsersController extends AppController {
…
public $layout = "common";
/**
* コンポーネントの設定
*/
public $components = array('ApiTool','RequestHandler');
public function index() {
}
public function api_get($type = null){
// リクエストをデバッグログに書き出し
$this->ApiTool->logingRequest($this->request);
// 引数チェック。空か、指定タイプ以外だったら404エラー
$this->ApiTool->checkType($type,array('user_list'));
// タイプごとにmodelsを作り分ける。
if ($type == 'user_list'){
$models = array(
array('name'=>'yamada','id'=>115),
array('name'=>'kitamura','id'=>116),
array('name'=>'matsumoto','id'=>117),
);
$this->set('models',$models);
}
// ビュークラスをJSONにする
$this->viewClass = 'Json';
$this->set('_serialize', array('models'));
}
public function beforeFilter() {
parent::beforeFilter();
$this->set('title_for_layout','HogeUsers');
}
}
自作したコンポーネント「ApiTool」も設定してます。
「api_get」アクションを作って中身を書いていきます。「$this->viewClass = 'Json';」の部分でJSON用のビューを設定しているようです。最後のシリアライズ「$this->set('_serialize', array('models'));」も忘れないようにしましょう。
自作コンポーネント「ApiTool」
同じ処理を色々な箇所で書きそうだったのでコンポーネントを自作しました。 /app/Controller/Component/ApiToolComponent.php
App::uses('Component', 'Controller');
class ApiToolComponent extends Component {
// リクエストの内容をログに書き出す。
public function logingRequest($request = null){
if (empty($request)) return;
$this->log($request->params, 'debug');
$this->log($request->data, 'debug');
$this->log($request->query, 'debug');
}
// 引数チェック。空か、$types以外だったら404エラー
public function checkType($type,$types=array()){
if (empty($type) || empty($types)) throw new NotFoundException('このページはありません。');
if (empty($type) || !in_array($type,$types)){
throw new NotFoundException('このページはありません。');
}
}
}
JSON用のページにアクセスしてみる
これでJSONが吐出されるのでブラウザで「http://sample.com/api/hogeUsers/get/user_list」にアクセスしてみます。 以下が表示されました。
{"models":[{"name":"yamada","id":115},{"name":"kitamura","id":116},{"name":"matsumoto","id":117}]}
しかしこれでは上手く行きません。続きは次回です。
環境とか
| 項目 | 内容 |
|---|---|
| PHPフレームワーク | Cakephp 2.2.5 |
| CSSフレームワーク | Twitter bootstrap 2.2.2 |
| IDE | Eclipse 3.6 |
| 開発環境? | MAMP |
| PC | iMac |
| OS | Mac OS Lion |
0 件のコメント:
コメントを投稿