CakePHPでAtndAPIを使うコンポーネントを作ってみた。

作ったというほど大したことはしてないのでコンポーネントを作るときの参考にでもして頂ければと。

PHPのバージョンが古い人用にZendを使う前提になっています。

Zendを使う方法はこちら

<?php
App::import('Core', 'http_socket');
class AtndApiComponent extends Object {
	/**
	 * API通信時に使用するURL
	 */
	var $apiBaseUrl = 'http://api.atnd.org/';
	/**
	 * イベント
	 */
	public function events(array $params, $format = null, $count = null) {
		return $this->_execute('events', $params, $format, $count);
	}
	/**
	 * 出欠
	 */
	public function users(array $params, $format = null) {
		return $this->_execute('events/users', $params, $format);
	}
	/**
	 * Call API
	 */
	private function _execute($method, $params = array(), $format = null, $count = null) {
		$url = sprintf('%s%s/?%s', $this->apiBaseUrl, $method, $this->_buildUrl($params, $format, $count));
		/*
		 * タイムアウトをしているする場合はこんな感じ
		 * $socket = new HttpSocket(array('timeout' => '20'));
		 */
		$socket = new HttpSocket();
		$data = $socket->get($url);
		if ( $format === "json" ) {
			return json_decode($data);
			/*
			 * PHPのバージョンが古い場合はZendを使うとよいかと。
			 * App::import('Vendor', 'zendInit');
			 * App::import('Vendor', 'Json', array('file' => 'Zend' . DS . 'Json.php'));
			 * return Zend_Json::decode($data);
			 */
		} else if ($format === 'xml' || $format === 'atom') {
			return simplexml_load_string($data);
		}
		return $data;
	}
	private function _buildUrl($params = array(), $format = null, $count = null) {
		if (!is_null($format)) {
			$params['format'] = $format;
		}
		if (!is_null($count)) {
			$params['count'] = $count;
		}
		$queries = array();
		foreach ($params as $key => $value) {
			if(!is_null($value)) {
				$queries[] = $key . '=' . $value;
			}
		}
		return implode('&', $queries);
	}
}
?>