开发可维护的RPC系统

我正在开发一个web应用程序,它将广泛使用AJAX技术进行客户机/服务器通信……特别是JSON-RPC。Zend框架正在服务器端使用,它提供了一个我想要使用的很好的JSON-RPC服务器

我的目标是构建一个可维护的系统,向客户端(javascript)公开服务器端功能的一个子集,而不需要不必要的代码复制。我看过很多关于如何使用ZF的JSON-RPC服务器的博客文章和教程(请参见此处和此处),但它们似乎都是为了公开一个小型的、可公开使用的API。代码重复很常见,例如,一篇博客文章公开了以下方法:

公共静态函数setTitle($bookId,$title){
$book=新镍币版图书($bookId);
$book->设置标题($title);
$book->更新();
返回true;
}

我不喜欢有两种setTitle方法。如果其中一个的方法签名发生了变化,那么另一个就必须保持同步……如果您的API是广泛的,那么维护性就好像是一场噩梦。在我看来,应该有一个Book类,有一个setTitle方法

我最初的想法是向我想要公开的方法/类添加docblock注释@export。当我决定公开setTitle方法时,我只添加注释而不是新方法

我看到的一个潜在问题涉及对象持久性。在服务器端,setTitle设置对象的title属性是有意义的……但在调用update()之前,不要将其保留在数据库中。客户端调用setTitle会立即影响数据库。一种可能的解决方案是修改所有访问器,使其采用可选的第二个参数,表示修改应立即更新数据库:

函数setTitle($title,$persist=false){
$this->title=$title;
如果($persist)$this->update();
}

某种代理类可以确保为所有客户端RPC调用设置$persist标志

另一个问题是PHP对象的序列化。在服务器端,使用OO样式$book->setTitle(“foo”)调用,但是客户端book.setTitle(1234,“foo”)由于缺少状态而有意义(其中1234是书的ID)。我的解决方案是让前面提到的代理类负责以某种方式将book.setTitle(1234,“foo”)转换为:

$book=新书();
$book->负荷(1234);
返回$book->片名($片名);

我觉得这个问题以前一定被解决过或讨论过……但我在网上找不到太多的资源。这似乎是一个明智的解决方案吗

您正在寻找的是服务层

它们的实体应该是纯粹的数据容器(除非您使用的是活动记录),您应该只公开您的服务层,而这反过来又访问它们的实体及其各自的方法

您的服务级别如下:

classbookservice扩展服务{
//...
公共功能changeBookTitle($title,Book$Book)
{
//验证$title是否正确有效
$book->设置标题($title);
$this->methodToGetThePersistenceManager()->save($book);
//激发事件、创建结果对象等。。。
}
}

发表评论