开放的编程资料库

当前位置:我爱分享网 > PHP教程 > 正文

开始编写可嵌入的应用程序

ClayLoveless去年写了一篇题为“停止编写独行侠应用程序”的文章,在文中他对所有单体应用程序大加指责,在用户身份验证方面,它们的行为就像是唯一的孩子。基本上,如果您想创建一个使用多个第三方现成PHP应用程序(例如,论坛、博客和wiki)的站点,那么在它们之间使用共享身份验证可能会非常痛苦。

在过去的几个月里,我反复遇到了类似的问题:这些应用中的大多数根本无法嵌入,至少在不修改源代码的情况下是不可嵌入的。

“为什么嵌入?”你问。很简单:如果我创建的网站既有这些应用程序中的一两个,也有我(或我公司)自己的自定义功能,我可能想确保某些元素出现在所有页面上,或者我可以控制某些内容在所有页面中:统一的页眉和页脚,能够注入统计跟踪javascript等。

主要的态度是“不要嵌入我们的应用程序,将您的应用程序嵌入我们的应用程序”或“只需修改模板”。这两种解决方案都不可接受。

为什么不呢?在第一种情况下,它是我的站点。如果我正在混合和匹配几个这样的应用程序,我应该嵌入哪些,哪个应该是主应用程序?老实说,为站点编写的应用程序是主应用程序;第三方解决方案应嵌入我的网站。

在第二种情况下,我可能有自己的页眉和页脚,以及用于自动执行嵌入跟踪脚本的工具—换句话说,我正在运行自己的显示逻辑,可能使用我自己的工具。将这些工具嵌入到另一个应用程序模板中有时很困难(如果应用程序只是使用PHP,困难可能主要是找到要更改的代码),有时是不可能的(如果应用程序使用的模板引擎与我正在使用的完全不同,或者一个不允许任意PHP)。为什么我必须为每个应用程序的代码编写一个接口?

说实话,在大多数情况下使用两步视图很有意义,让应用程序生成内容,然后将其注入到我控制的站点范围模板中。

我在很多情况下都尝试过编写包装器,这样我就可以从这些第三方应用程序中获取内容,通常使用输出缓冲来捕获输出,这样我就可以将它注入到我自己的视图中。到目前为止,我的经历普遍令人沮丧。大多数安全、健壮的应用程序(我不打算命名)仍然至少对主脚本(通常是index.php)使用过程方法。这包括从其他文件中窃取配置……所有这些都发生在全局命名空间中。有什么问题?我编写的大多数包装器必然是类方法或函数,或者从其中运行,这意味着全局命名空间不再有效。最终结果是,我必须大幅修改代码才能让事情正常运行——在一个案例中,我和我的同事最终将所有$_GLOBALS引用更改为$_SESSION使事情正常进行。Hackish,但它完成了工作。然而,这也意味着在我们编写脚本之前升级将是一场噩梦。

如果您正在编写一个独立的PHP应用程序,也许是下一个很棒的论坛软件、博客软件、wiki或您拥有的其他软件,请以易于嵌入的方式设计它:

  • 使用配置文件时,使用不需要使用全局命名空间的配置组件(PEAR的Config、Solar的Solar_Config和ZendFramework的Zend_Config浮现在脑海中);当与注册表结合使用或实现为静态类属性(在PHP5中)时,您可以从应用程序的任何位置访问配置。
  • 让您的引导程序脚本调用类方法或函数来完成它们的工作。不要在全局命名空间中做任何决定。
  • 更好的是,在您的应用程序中使用MVC模式,并让您的引导程序简单地分派控制器。这可以很容易地复制到其他人的代码中,或者直接包含在内。
  • 确保您的模板易于修改,以允许开发人员去除页眉、页脚和菜单元素。
  • 创建一个API以允许检索必要的javascript和CSS,以便稍后可以将其注入到另一个系统的模板中。
  • 永远不要使用$_GLOBALS。这似乎是一种保持变量可跨类和函数访问的简单方法,但使用PHP5的静态属性,或在PHP4中明智地使用单例属性,还有其他方法可以实现相同效果且副作用更少。

如果您负责维护现有项目,请立即开始修复您的应用程序,以便将其嵌入。信不信由你,它实际上可能会增加您的项目的采用率,因为更多的人将能够在他们现有的站点中使用它。至少,您会阻止我胡言乱语,并减少我在对乙酰氨基酚上的花费。

未经允许不得转载:我爱分享网 » 开始编写可嵌入的应用程序

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏