2011-01-14 63 views
1

首先,讓我解釋一下我正在嘗試做什麼。CakePHP和在REST中處理參數

我已經成功實施與CakePHP的SOAP服務,使用此教程:

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

這部分的偉大工程。我可以通過SOAP發送和接收XML消息,並且我有大約6個控制器以及一些不同的函數來處理這些請求。

我想要的是這個相同的應用程序也能夠通過REST處理請求。到目前爲止,我已經設法將mapResources()和parseExtentions()添加到我的routes.php文件中,它對於不需要任何參數傳遞以正常工作的函數非常有用,即,我可以轉到URL像

本地主機/目錄/ CONTROLLER_NAME/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

從任意請求獲取參數的更好方法是使用cake-style約定來獲取參數。您可以從您的控制器中訪問$this->params['url'],而不是使用$_GET超全局陣列。

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請求,所以任何具有參數的控制器函數都只需要一個stdClass作爲輸入。如果我按照自己的方式做了,我將不得不返回並更改所有現有的代碼,以手動獲取$ this-> param ['url']中的所有變量,而不僅僅是讓路徑找出它,並且匹配函數簽名。 – user470714 2011-05-09 06:50:59