2011-01-14 9 views
1

まずは、私が何をしようとしているのか説明しましょう。CakePHPとRESTの処理パラメータ

私は正常にこのチュートリアルを使用して、CakePHPの持つSOAPサービスを実装している:

http://bakery.cakephp.org/articles/Marcelius/2009/02/10/soap-services-in-cakephp

その部分が素晴らしい作品。私はSOAPを介してXMLメッセージを送受信することができ、私はそれらの要求を処理するために、さまざまな機能のセットアップを備えた約6つのコントローラを持っています。

私が持っていたいのは、同じアプリケーションで、REST経由のリクエストも処理できます。これまでのところ、routes.phpファイルにmapResources()とparseExtentions()を追加することができました。これは、正常に動作するためにパラメータを必要としない関数、つまりURL以下のような

はlocalhost /ディレクトリ/コントローラ名/ function_name.xml

...と私はすべての結果が返されます、と私はやっとそれが仕事を得るために私の既存のコードに触れることがあります。

しかし、実際には、関数が入力パラメータを必要として正しく動作するようにするのが難しいです。これらの変数の中には、配列のように複雑すぎるものもあります。

file_get_contents( "php:// input")を使用して受信リクエストボディをフェッチして解析する方法については読んだことがありますが、実際にはうまくいきません。そのソースからフェッチするために私の既存のコードをすべて変更し、すべての関数呼び出しは欠落しているパラメータの警告を投げます。

私がしようとしていることは可能ですか? CakePHPでこの状況を処理する最善の方法は何でしょうか?

TIA

答えて

0

は種類のしばらくの間...

のために苦労した後、私はGET経由して関数のパラメータを渡してしまったが、これはまだに直接渡されるためにそれらを必要な、今日は自分の質問に答えましたコントローラの機能はstdClassとして機能します。これは、PHPのSOAPクラスがパラメータを処理する方法であり、既存のコードが期待しているとおりです。私はこのようになりますカスタムcakerouteクラス作ることができた:

class GetRestParamRoute extends CakeRoute { 
function parse($url) { 
    $params = parent::parse($url); 

    if(count($_GET) > 1){ 


     $obj = new stdClass(); 
     foreach($_GET as $get_var_name => $get_var_value){ 

      if($get_var_name == "url") continue; 

      $obj->$get_var_name = $get_var_value; 
     } 


     $params['pass'][] = $obj; 
    } 

    return $params; 
} 

をそしてroutes.phpの中で

 App::import('Lib', 'routes/GetRestParamRoute'); 
    Router::connect('/:controller/:action', array(), 
      array('routeClass' => 'GetRestParamRoute')); 

は、だから何ここで起こることは、すべてのURLリクエストがカスタムルートクラスに渡されるということですこれはGET変数を参照し、URL自体でない場合は、stdclassにメンバとして追加され、パラメータの渡された変数に追加され、呼び出されたときにコントローラ関数に渡されます。私は、すなわち私のroutes.phpの

 Router::mapResources("myController"); 
    Router::parseExtensions('xml'); 

出来上がりにこれを追加した、ケーキの本として応答は「簡単なセットアップ」を宣言して取り扱わ!コントローラごとにXMLビューを追加すると、すべての関数呼び出しをGETで実行し、RESTful XMLとして返すことができます。

2

任意の要求からパラメータを取得するより良い方法は、ケーキスタイルの規則を使用してパラメータを取得することです。 $_GETスーパーグローバル配列を使用する代わりに、コントローラ内から$this->params['url']にアクセスすることができます。

http://localhost/CAKE_DIR/profilePhotos.json?param1=123&param2=456

$this->params['url']はそうのようなURLとパラメータを分割します:通常の状況で

{"ext":"json","url":"profilePhotos.json","param1":"123","param2":"456"}

+0

これはまともな人はそれを行うだろうかです。しかし、この場合は動作しません。既存のコードはsoap要求を処理するために用意されているので、パラメータ付きのコントローラ関数は入力としてただ1つのstdClassを必要としています。もし私があなたのやり方をしたら、私は元のコードをすべて変更して、手作業で$ this-> param ['url']からすべての変数を手に入れてルートを見つけ出すだけでなく、関数の署名 – user470714

関連する問題