cakePHP1.2でRESTfulなPUTでEDIT
ここではPUTメソッドでXML形式のデータを受信して更新します。
まずはコードを。
普通アクセスの場合は、まずfindして入力フォームに送る。受信データがあればsave、失敗したら$this->dataをsetして戻す、
RESTアクセスの場合は、XMLとみなしてUnserializeして$this->dataにしてsave。エラーがあればステータスコード400を返す。
function edit($id = null) {
if(!empty($this->params['id'])) $id = $this->params['id'];//RESTアクセスの場合idをparamsから取る
if(!$id) die;//idがなければ終了
$this->pageTitle = "編集";//ページタイトル
$REQUEST_METHOD = $_SERVER['REQUEST_METHOD'];//RESTアクセスの判断
if($REQUEST_METHOD == 'PUT') {//PUTの場合
//認証しましょう
$putdata = fopen("php://input","r");//一般入力php://inputから取るそうだ
require_once("XML/Unserializer.php");//ライブラリ読み込み
$param = array('complexType' => "array");
$xml = new XML_Unserializer($param);//パラメーターを指定してインスタンス化
$xml->unserialize($putdata);//データを渡す
$result = $xml->getUnserializedData();//XMLから配列を得る
if (PEAR::isError($result)) {//エラーがあれば
header("HTTP/1.0 400 Bad Request");//コード400を返す
die($result->getMessage());//エラーメッセージも送って終了
} else {
$this->data = $result;//変換成功なら$this->dateにしてしまう。
}
}
if(!empty($this->data)) {//受信データがあれば
//ここでデータを検証しましょう
if(($this->Article->create($this->data) && $this->Article->validates())) {//バリデーションチェック
$this->Article->save($this->data);//通ればsave
$cond = array("Article.id" => $id);
$article = $this->Article->find($cond);//save後のデータを取る
} else {//失敗したら
$article = $this->data;//$this->dataを戻す
if($REQUEST_METHOD == 'PUT') {//RESTアクセスの場合
header("HTTP/1.0 400 Bad Request");//400を返す
die(join($this->validateErrors($this->Article)));//バリデーションエラーをモデルから渡す
}
}
} else {
$cond = array("Article.id" => $id);//通常初回アクセスの場合
$article = $this->Article->find($cond);//データを取る
}
if($REQUEST_METHOD == 'PUT') exit;//RESTアクセスの場合、終了
if(!$article) die;//データがなければ終了
$this->set('article',$article);//VIEWに渡す
}
apcheのhttpd.confでLIMIT GET POST PUT DELETEもしておく必要があるのかな。
たいていのWWWブラウザーではメソッドにGETとPOST以外は使えないので、専用ソフトを使いました。
なぜか「eXeve」ではPUT>EDIT誘導がうまくいかなくて「restclient」と「RESTTest」でやったらうまく出来たよ。

