2011-01-14 79 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