CakePHP2でRESTfulなAPI作って、ついでにYahooAPI(知恵袋API)を利用する方法

取り急ぎのメモ。

まずは初期設定。ググれば出てくる。

app/Config/routes.phpの一番上に以下を記載。下の方に書くとイマイチらしい。

<?php
/**
 * REST Router
 */
//利用するAPIやModelが増えるたびに追記
Router::mapResources('my_datas');
Router::mapResources('yahoo_apis');
//RESTfulにするおまじない
Router::parseExtensions();

/**
 * Routes configuration
 *
以下略

その後、以下のページを参考にController調整とViewの削除。
ちなみにRouterの設定はしなくてもで大丈夫でした。
http://qiita.com/aokazu/items/bae64fe4decc2cd2c933

Datasourceを使ってYahooAPIをModelにする

基本コレを参考に作ればOK。
http://book.cakephp.org/2.0/ja/models/datasources.html

今回利用したYahooAPIは知恵袋APIだったのでXML形式しか用意されてなかったり、パラメータがapiKeyではなくappidだったり異なる部分が多いので92行目付近を以下修正。

    /**
     * CRUD のうちの R を実装します。 ``Model::find()`` への呼び出しは
     * ここに来ます。
     */
    public function read(Model $model, $queryData = array(),
                         $recursive = null) {
        /**
         * ここでは、前述の calculate() メソッドで返されるカウントの
         * 実際の処理を行います。リモートソースのチェックをするか、
         * またはそれ以外の方法でレコードカウントを取得します。
         * ここでは単に 1 を返しているので、 ``update()`` や
         * ``delete()`` ではレコードが存在するものとみなされます。
         */
        if ($queryData['fields'] === 'COUNT') {
            return array(array(array('count' => 1)));
        }
        /**
         * ここではリモートデータを取得およびデコードして返します。
         */
        $queryData['conditions']['appid'] = $this->config['apiKey'];
        $xml = $this->Http->get(
            'http://chiebukuro.yahooapis.jp/Chiebukuro/V1/questionSearch',
            $queryData['conditions']
        );
        $res = simplexml_load_string($xml);
        if (is_null($res)) {
            $error = "Failed loading XML\n";
            throw new CakeException($error);
        }
        return array($model->alias => $res);
    }

タグ検索を用意したい

http://blog.machacks.net/2013/08/05/cakephp%E3%81%A8mysql%E3%81%A7%E4%BD%9C%E3%82%8B%E3%82%BF%E3%82%B0%E6%A9%9F%E8%83%BD1/

なんか動かない場合

取り急ぎapp/tmp/chacheあたりを削除。コレでダメなら
cat app/tmp/logs/error.log