gpt4 book ai didi

php - Zend framework Restful web服务逻辑使用

转载 作者:搜寻专家 更新时间:2023-10-31 21:17:23 24 4
gpt4 key购买 nike

我正在使用 zend 框架构建应用程序。

问题是,如何在非 REST 应用程序中使用与 Zend_Rest_Controller 相同的 Controller 逻辑。

例如,假设 Twitter 是使用 Zend Framework 编写的。他们可能会将 Zend_Rest_controller 和 Route 用于他们的 API。但是,他们的网站会使用什么(显然使用相同的 API 逻辑)?他们会编写一个全新的应用程序来简单地触发 REST 请求吗?这不是重载吗。

[编辑]
如果 Web 应用程序通过某些 http_client 类调用 API 来获取数据,则会向服务器发出另一个请求(这会导致性能下降并减慢响应速度)。我不想发出另一个请求,而是想使用 API 中的相同业务逻辑。

谢谢,
地点

最佳答案

新答案:

我想出了一个似乎运作良好的模式。它解决了您所有的顾虑:这是我想出的缩小版本:

首先我们需要自己的 Controller 。这个 Controller 将有一个服务,如果没有定义,它会代理任何对服务的操作请求:

abstract class App_Rest_Controller extends Zend_Controller_Action
{
/**
* @var App_Rest_Service_Abstract
*/
protected $_service;

public function __call($methodName, $args)
{
if ('Action' == substr($methodName, -6)) {
$action = substr($methodName, 0, strlen($methodName) - 6);
return $this->_service()->$action();
}

return parent::__call($methodName, $args);
}
}

现在是服务时间。我们扩展 Action Helper Abstract 以便:

  1. 我们可以直接访问请求对象
  2. 我们可以轻松地从任何 Controller 调用服务

这将充当应用程序和数据的实际存储之间的过渡。

abstract class App_Rest_Service_Abstract extends Zend_Controller_Action_Helper_Abstract
{
/*
* @var App_Rest_Storage_Interface
*/
protected $_storage;
public function __call($methodName, $args)
{
if (!method_exists($this->getStorage(), $methodName)) {
throw new App_Rest_Service_Exception(sprintf('The storage does not have the method "%s"', $methodName));
}

switch ($methodName) {
case 'get':
case 'put':
case 'delete':
//if id param isnot set, throw an exception
if (FALSE === ($id = $this->getRequest()->getParam('id', FALSE))) {
throw new App_Rest_Service_Exception(sprintf('Method "%s" expects an id param, none provided', $methodName));
}
$iterator = $this->getStorage()->$methodName($id, $this->getRequest()->getParams());
break;
case 'index':
case 'post':
default:
//if index, post or not a tradition RESTful request, the function must expect the first and only argument to be an array
$iterator = $this->getStorage()->$methodName($this->getRequest()->getParams());
break;
}


return $this->_getResult($iterator);
}

protected function _getResult($iterator)
{ /*
* write your own, in my case i make a paginator and then
* either return it or send data via the json helper
*
/*
}

现在是界面。这将完成存储、修改和返回数据的实际工作。将它用作接口(interface)的美妙之处在于,无论您对模型​​层使用什么,都可以轻松实现它。我创建了一个抽象存储,它只有一个 Zend_Form(用于验证)和一个用于实际数据的 Zend_Db_Table。但您也可以在任何对象上实现它。

interface App_Rest_Storage_Interface extends Zend_Validate_Interface
{
public function index(array $params = NULL);

public function get($id, array $params = NULL);

public function post(array $params);

public function put($id, array $params);

public function delete($id, array $params);

}

现在可以在您网站的任何地方操作。假设您有一个“客户”服务。在任何 Controller 中都非常简单

$customer = $this->_helper->helper->customers->get(1);

其他任何地方(例如 View 助手):

Zend_Controller_Action_HelperBroker::getStaticHelper('customers')->get(1)

希望对您有所帮助。它对我来说效果很好。

关于php - Zend framework Restful web服务逻辑使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5831433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com