API のルートの定義に問題があります
私のApiController:
class ApiController extends Controller
{
// Members
/**
* Key which has to be in HTTP USERNAME and PASSWORD headers
*/
Const APPLICATION_ID = 'APP';
/**
* Default response format
* either 'json' or 'xml'
*/
private $format = 'json';
/**
* @return array action filters
*/
public function filters()
{
return array();
}
// Actions
public function actionGetAllCategories()
{
$models = Categories::model()->findAll();
if(empty($models)) {
// No
$this->_sendResponse(200,
sprintf('No items where found for model'));
} else {
// Prepare response
$rows = array();
foreach($models as $model)
$rows[] = $model->attributes;
// Send the response
$this->_sendResponse(200, CJSON::encode($rows));
}
}
public function actionGetRowsByCategory()
{
}
public function actionGetRowsByCond ()
{
}
private function _sendResponse($status = 200, $body = '', $content_type = 'text/html')
{
// set the status
$status_header = 'HTTP/1.1 ' . $status . ' ' . $this->_getStatusCodeMessage($status);
header($status_header);
// and the content type
header('Content-type: ' . $content_type);
// pages with body are easy
if($body != '')
{
// send the body
echo $body;
}
// we need to create the body if none is passed
else
{
// create some body messages
$message = '';
// this is purely optional, but makes the pages a little nicer to read
// for your users. Since you won't likely send a lot of different status codes,
// this also shouldn't be too ponderous to maintain
switch($status)
{
case 401:
$message = 'You must be authorized to view this page.';
break;
case 404:
$message = 'The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found.';
break;
case 500:
$message = 'The server encountered an error processing your request.';
break;
case 501:
$message = 'The requested method is not implemented.';
break;
}
// servers don't always have a signature turned on
// (this is an apache directive "ServerSignature On")
$signature = ($_SERVER['SERVER_SIGNATURE'] == '') ? $_SERVER['SERVER_SOFTWARE'] . ' Server at ' . $_SERVER['SERVER_NAME'] . ' Port ' . $_SERVER['SERVER_PORT'] : $_SERVER['SERVER_SIGNATURE'];
// this should be templated in a real-world solution
$body = '
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>' . $status . ' ' . $this->_getStatusCodeMessage($status) . '</title>
</head>
<body>
<h1>' . $this->_getStatusCodeMessage($status) . '</h1>
<p>' . $message . '</p>
<hr />
<address>' . $signature . '</address>
</body>
</html>';
echo $body;
}
Yii::app()->end();
}
private function _getStatusCodeMessage($status)
{
// these could be stored in a .ini file and loaded
// via parse_ini_file()... however, this will suffice
// for an example
$codes = Array(
200 => 'OK',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
500 => 'Internal Server Error',
501 => 'Not Implemented',
);
return (isset($codes[$status])) ? $codes[$status] : '';
}
}
私のルート:
'rules'=>array(
array('api/getallcategories', 'pattern'=>'api/<model:\w+>', 'verb'=>'GET')(not working),
'<controller:\w+>/<id:\d+>'=>'<controller>/view',
'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
),
3つのアクションが必要です:
- モデルからすべてのデータを取得 (カテゴリ) => actionGetAllCategories [[GET] パラメータなし]
- カテゴリ ID で行を検索 => actionGetRowsByCategory [[GET] カテゴリ配列]
- 基準で行を検索 => actionGetRowsByCond [[GET] タイムスタンプ、カテゴリ配列、タイトル (例)]
この3つのアクションのルートを書くのを手伝ってもらえますか?