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」でやったらうまく出来たよ。