基于Ajax的PHP-MVC框架:Zephyr
这一阵子使用了基于Ajax的PHP-MVC框架Zephyr。官方主页为 http://zephyr-php.sourceforge.net/。
该框架的Ajax通信机制使用第三方软件 cpaint (http://cpaint.booleansystems.com/)实现,而视图则使用PHP的官方模板 smarty (http://smarty.php.net/)实现。
基本的开发思想很简单:利用javascript通过Ajax来调用远程的php代码,然后自动地将返回结果显示在某个指定的div元素中。实现了以下的目标:
1. 业务逻辑和画面显示的分离。
业务逻辑完全在php代码中实现,而画面显示则完全由smarty提供的模板语言写成。
2. 完全封装了ajax操作。
利用cpaint完全封装了ajax操作,开发时完全不必考虑ajax的复杂性,而可以像开发windows程序那样进行ajax程序的开发。
3. 解决了动态装入js代码的执行问题。
Ajax应用中有一个很重要的问题,就是通过Ajax动态读入的javascript代码不会被自动执行。而zephyr解决了这个问题。
不过,我也同时发现zephyr的一个缺点。
1. 同时读取多个div的内容会引起冲突。
如果试图同时读取画面上多个div,则会导致显示混乱。这是因为,zephyr使用一个全局变量来保存div的名称,因此同时读取多个div时,仅有最后一个div的名字被保存,导致本应读入到各个div中的内容全部都被装入最后一个div。为解决此问题,应当在zephyr的核心javascript/function.js中增加信号量互斥的操作:仅有得到信号量的更新操作才允许进行,如果获取信号量失败,则等待一定时间之后再次尝试,直到成功为止。这样就能够保证各个更新操作依次执行,而不会引起冲突。