読者です 読者をやめる 読者になる 読者になる

localdisk

PHP とか Java とか Web とか好きなことを書きます。

前のエントリををちゃんと書いた

前回のエントリで書いたソースは最低限だったので、もうちょっとちゃんとしたよ。

変更点

  • ホットペッパーAPIの全てのAPIをメソッドで呼べるようにした
  • exitを書いているところを throw new Exceptionするようにした

openpearあたりにリリースしようかしらん。Services_Recruit_Hotpepperとかで。

<?php
/**
 * HotpepperAPIを操作するクラス
 *
 * @version 0.1.0
 */
class Hotpepper {
    /**
     * URL
     */
    const BASEURL = 'http://webservice.recruit.co.jp/hotpepper/';

    /**
     * APIキー
     * 
     * @var string $apiKey
     */
    private $apiKey;

    /**
     * APIバージョン
     * 
     * @var string $apiVersion
     */
    private $apiVersion;

    /**
     * コンストラクタ
     * 
     * @param string $apiKey
     * @param string $apiVersion
     */
    public function __construct($apiKey = null, $apiVersion = null) {
        if (is_null($apiKey)) {
            throw new Exception('$apiKey not found');
        }
        $this->apiKey = $apiKey;
        $apiVersion !== null ? $this->apiVersion = $apiVersion : $this->apiVersion = 'v1';
    }

    /**
     * グルメサーチを行います
     *
     * @param  array $params
     * @return object
     */
    public function getGourmet($params = array()) {
        return $this->_send('gourmet', $params);
    }

    /**
     * 店名サーチを行います
     *
     * @param  array $params
     * @return object
     */
    public function getShop($params = array()) {
        return $this->_send('shop', $params);
    }

    /**
     * 検索予算マスタを取得します
     *
     * @param  array $params
     * @return object
     */
    public function getBudget() {
        return $this->_send('budget');
    }

    /**
     * 大サービスエリアマスタを取得します
     * 
     * @param  array $params
     * @return object
     */
    public function getLargeServiceArea($params = array()) {
        return $this->_send('large_service_area', $params);
    }

    /**
     * 大エリアマスタを取得します
     * 
     * @param  array $params
     * @return object
     */
    public function getLargeArea($params = array()) {
        return $this->_send('large_area', $params);
    }

    /**
     * 中エリアマスタを取得します
     * 
     * @param  array $params
     * @return object
     */
    public function getMiddleArea($params = array()) {
        return $this->_send('middle_area', $params);
    }

    /**
     * 小エリアマスタを取得します
     * 
     * @param  array $params
     * @return object
     */
    public function getSmallArea($params = array()) {
        return $this->_send('small_area', $params);
    }

    /**
     * ジャンルマスタを取得します
     * 
     * @param  array $params
     * @return object
     */
    public function getGenre($params = array()) {
        return $this->_send('genre', $params);
    }

    /**
     * 料理名マスタを取得します
     *
     * @param  array $params
     * @return object
     */
    public function getFood($params = array()) {
        return $this->_send('food', $params);
    }

    /**
     * サービスエリアマスタを取得します
     * 
     * @return object
     */
    public function getServiceArea() {
        return $this->_send('service_area');
    }

    /**
     * クレジットカードマスタを取得します
     *
     * @param  array $params
     * @return object
     */
    public function getCreditCard($params = array()) {
        return $this->_send('credit_card', $params);
    }
    /**
     * URLに接続します
     *
     * @param string $method
     * @param array $params
     * @param string $format
     * @return string|array|object
     */
    private function _send($method, $params = array(), $format = null) {
        $url = sprintf('%s%s/%s/?key=%s&amp;%s',
                       self::BASEURL,
                       $method,
                       $this->apiVersion,
                       $this->apiKey,
                       $this->_buildQuery($params, $format));
        if (!extension_loaded('curl')) {
            throw new Exception('cURL extension not loaded.');
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);          // 接続URLを定義
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  // curl_execで戻り値を取得
        curl_setopt($ch, CURLOPT_VERBOSE, 0);         // 詳細出力をoff
        curl_setopt($ch, CURLOPT_HEADER, 0);          // ヘッダは出さない
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);  // タイムアウトは5秒
        $response = curl_exec($ch);
        if ($response === false) {
            throw new Exception('errorno:'. curl_errno($ch) . ' error:' . curl_error($ch));
        }
        if (curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) {
            throw new Exception('status code:' . curl_getinfo($ch, CURLINFO_HTTP_CODE));
        }
        return simplexml_load_string($response);
    }

    /**
     * クエリーストリングを作成します
     * 
     * @param array $params
     * @param string $format
     * @return string
     */
    private function _buildQuery($params = array(), $format = null) {
        if (!is_null($format)) {
            $params['format'] = $format;
        }
        $queries = array();
        foreach ($params as $key => $value) {
            if(!is_null($value)) {
                $queries[] = $key . '=' . urlencode($value);
            }
        }
        return implode('&amp;', $queries);
    }
}
?>