我正在开发一个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);
//激发事件、创建结果对象等。。。
}
}