围绕“Web2.0”的喧嚣是共享数据。在早期的迭代中,重点是“混搭”——使用现有的公共API以便以独特的方式混合和匹配数据。现在,我经常听到更多关于公开服务供其他人使用的信息。ZendFramework通过其各种服务器类使后者变得非常容易。
所有ZendFramework服务器类都遵循PHP的SoapServerAPI。简而言之,您基本上可以对任何服务器类执行以下操作:
$server = new Zend_XmlRpc_Server(); $server->setClass('My_Awesome_Api'); echo $server->handle();
我们以这种方式支持的每个服务器协议——SOAP、XML-RPC、JSON-RPC和AMF——都有自己的细微差别,但基本遵循上述模式。
但是,您应该在哪里执行此操作?许多开发人员希望将其直接粘贴到他们的MVC应用程序中,以便拥有漂亮的URL。但是,框架团队通常不建议这样做。在提供API服务时,您希望响应尽快返回,并且由于服务器在其设计中基本上封装了前端控制器和MVC模式,因此没有充分的理由重复进程并增加处理开销。
此外,通常需要对API进行版本控制。当您添加新功能或需要更改方法签名时,您需要引入新版本的API供开发人员使用。
解决每个问题的一个建议是将您的服务器端点移动到您的公共目录结构中,然后利用您的网络服务器的URL重写功能。例如,您可以按如下方式组织端点:
public |-- api | |-- v1 | | |-- xmlrpc.php | | |-- soap.php | | |-- jsonrpc.php
然后您可以按如下方式配置您的URL重写:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^api/v1/xmlrpc api/v1/xmlrpc.php [L] RewriteRule ^api/v1/soap api/v1/soap.php [L] RewriteRule ^api/v1/jsonrpc api/v1/jsonrpc.php [L] RewriteRule ^.*$ index.php [NC,L]
这允许您在必要时将服务脚本移动到其他位置,并使每个脚本具有明确的依赖关系以将它们与代码库中其他地方的更改隔离开来。
作为标准的最佳实践,您不希望代码重复。采用上述策略时,代码重复变得非常普遍,因为每个端点脚本通常具有用于引导应用程序的通用逻辑。避免这种情况的一种方法是利用Zend_Application。您可以通过以下两种方式之一来实现:(1)使用与MVC应用程序相同的配置实例化Zend_Application
,并有选择地引导必要的资源;或者(2)扩展您的MVC应用程序的引导程序类,并覆盖run()
方法。
在第一种情况下,您可以在服务器端点脚本中执行以下操作:
// Initialize application require_once 'Zend/Application.php'; $app = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); // Selectively bootstrap resources: $app->bootstrap('db'); // Instantiate server, etc. $server = new Zend_XmlRpc_Server();
在第二种情况下,您将子类化您的应用程序引导程序类,并覆盖run()
方法。这样的扩展类可能如下所示:
class XmlRpc_Bootstrap extends Bootstrap { public function run() { $server = new Zend_XmlRpc_Server(); $server->setClass('My_Awesome_Api'); echo $server->handle(); } }
您还需要稍微修改您的应用程序引导以通知它您的新引导类:
$app = new Zend_Application( APPLICATION_ENV, array( 'bootstrap' => array( 'class' => 'XmlRpc_Bootstrap', 'path' => 'path/to/Bootstrap.php', ), 'config' => APPLICATION_PATH . '/configs/application.ini', ), ); $app->bootstrap() ->run();
因此,要点是:ZendFramework使公开Web服务变得容易,并且Zend_Application
的添加使得重用应用程序配置变得非常容易,以便通过应用程序中离散的、唯一的端点公开您的服务器.你还在等什么?