2013年3月22日金曜日

CakePHPとAngularJSでWebアプリを作る。その2

CakePHPでJSONを吐き出すページを作る。正規版

前のは失敗でした

その1で作ったJSON用のページは間違ってました。m(__)m申し訳ないです。以下はJSONを表示するページの作り直しです。
ちなみに今回のも完成ではありません。注意して下さい。


表示するURLを決める

CakePHPのお作法的にどういったURLが正しいか分かりませんが、以下の様にきめました。

http://sample.com/api/hogeUsers/get/user_list
「api」部分はプレフィックスです。core.phpに以下の部分のコメントアウトをとって「api」を追加しました。
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');
 } 
}
コンポーネントに「RequestHandler」を設定します。これはCakePHP2.xではJSON用のビューを使うための設定その2です。
自作したコンポーネント「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の配列がJSON形式で表示されてます。
しかしこれでは上手く行きません。続きは次回です。


環境とか
項目内容
PHPフレームワークCakephp 2.2.5
CSSフレームワークTwitter bootstrap 2.2.2
IDEEclipse 3.6
開発環境?MAMP
PCiMac
OSMac OS Lion

0 件のコメント:

コメントを投稿