javascript - 开发可维护的RPC系统

标签 javascript ajax zend-framework rpc json-rpc

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

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

public static function setTitle($bookId, $title) {
    $book = new Nickel_Model_Book($bookId);
    $book->setTitle($title);
    $book->update();
    return true;
}

我不喜欢有两个 setTitle 方法。如果一个的方法签名发生变化,另一个必须保持同步……如果您的 API 很广泛,这似乎是可维护性的噩梦。在我看来,应该有一个 Book 类,一个 setTitle 方法。

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

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

function setTitle($title, $persist = false) {
    $this->title = $title;

    if ($persist) $this->update();
}

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

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

$book = new Book();
$book->load(1234);
return $book->setTitle($title);

我觉得这个问题之前一定已经解决或讨论过了……但我在网上找不到很多资源。这看起来像是一个理智的解决方案吗?

最佳答案

你要找的是 Service Layer .

它们的实体应该是纯粹的数据容器(除非您使用的是 Active Record),您应该只公开您的服务层,而这又会访问它们的实体和它们各自的方法。

"Your Book class is a Domain Model, you should now create your Service Layer"

你的服务等级应该是这样的:

class BookService extends Service {

    //...

    public function changeBookTitle( $title, Book $book )
    {
        //verify if the $title is correct and valid
        $book->setTitle( $title );
        $this->methodToGetThePersistenceManager()->save( $book );

        //fire events, create a result object, etc...
    }
}

关于javascript - 开发可维护的RPC系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4248974/

相关文章:

javascript - Mongoose/Mongodb 基本 trello 类方案问题在 vue 中呈现

javascript - 检查整个 div 是否对用户可见

php - 使用数据库 onchange 中提供的 ajax 值自动计算

php - DQL查询表获取上周创建的记录

zend-framework - Zend 框架 - 即使指定隐藏元素也没有任何值(value)

mysql - 如何根据 MySQL 数据库中的日期为用户构建数据

javascript - 创建一个滑动图片库

javascript - 如何从另一个指令切换隔离范围的变量

ajax - 如何在通过 Ajax 提交之前在表单上使用浏览器验证?

php - 如何使用德语执行重复性任务