私は、クライアント/サーバー通信に AJAX 技術を幅広く使用する Web アプリケーションに取り組んでいます...特に JSON-RPC です。Zend Framework はサーバー側で使用されており、私が使用したい素敵な JSON-RPC サーバーを提供しています。
私の目標は、不要なコードの重複なしに、サーバー側の機能の大部分をクライアント側 (javascript) に公開する保守可能なシステムを構築することです。ZF の JSON-RPC サーバーの使用方法に関するブログ記事やチュートリアルを数多く見てきましたが (こことここを参照)、それらはすべて、一般に使用できる小さな API を公開することを目的としているように見えました。コードの重複はよくあることです。たとえば、あるブログ投稿で次のメソッドが公開されています。
public static function setTitle($bookId, $title) {
$book = new Nickel_Model_Book($bookId);
$book->setTitle($title);
$book->update();
return true;
}
setTitle
2つの方法があるという事実は好きではありません。1 つのメソッド シグネチャが変更された場合、もう 1 つのメソッドの同期を維持する必要があります... API が広範囲に及ぶ場合、保守性の悪夢のように思えます。Book
1 つのメソッドを持つ 1 つのクラスが必要であるように私には思えsetTitle
ます。
@export
私の最初の考えは、公開したいメソッド/クラスにdocblock 注釈を追加することです。メソッドを公開することに決めたときsetTitle
は、新しいメソッドではなく、注釈を追加するだけです。
私が見ている潜在的な問題の 1 つは、オブジェクトの永続性に関するものです。サーバー側では、オブジェクトの title プロパティを設定することは理にかなっていますが、が呼び出されるsetTitle
までデータベースに保持しないでください。update()
クライアント側の呼び出しsetTitle
は、すぐにデータベースに影響を与えるはずです。考えられる解決策の 1 つは、すべてのアクセサーを変更して、オプションの 2 番目のパラメーターを取り、変更によってデータベースがすぐに更新されることを示すことです。
function setTitle($title, $persist = false) {
$this->title = $title;
if ($persist) $this->update();
}
ある種のプロキシ クラスは$persist
、すべてのクライアント側の RPC 呼び出しに対してフラグが設定されるようにすることができます。
もう 1 つの問題は、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);
この問題は以前に取り組まれたり、議論されたりしたにちがいないような気がします...しかし、オンラインで多くのリソースを見つけることができません. これはまともな解決策のように思えますか?