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 件のコメント:
コメントを投稿