首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP:创建可扩展CMS系统

PHP:创建可扩展CMS系统
EN

Stack Overflow用户
提问于 2010-07-28 18:58:26
回答 1查看 3.5K关注 0票数 8

我从客户那里得到了一个新的任务,基本上是为演员/歌手创造一个CMS,这样的话,客户就会卖给他们。

这将基本上是一个包,并将开箱即用,非常类似于WordPress,你只是把它交给购买它的人,但当然,这不会是一个博客平台。它将允许开发人员:

  • 添加插件/小部件
  • 添加模板/主题

我认为观测器模式可能很有用,但我对此不太确定。你们可以建议在以下方面创建这样的灵活/可扩展的CMS:

  • 添加插件的能力(例如,WordPress)
  • 能够添加主题/模板(例如,WordPress)
  • 设计模式
  • 任何其他事情
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-28 19:56:41

观察者很好,但你必须考虑超越基本模式。规范的观察者/主题模式只将Subject对象发送给观察者,没有其他任何东西,甚至没有通知它的原因。

最初,解决方案可能还包括向观察者发出通知的原因,但最后您可能会通知不关心某些通知的观察者。一个更好的解决方案可能是要求观察者也要求一个他们想要接收的通知列表。

但这也带来了一个问题。为了使观察者真正地附加到主体上,他们必须被实例化。每次都是。即使他们永远不需要。那太傻了。

因此,我们很快就找到了插件的一个规范PHP实现:“钩子”。Hooks使用与观察者/Subject相同的概念,但是实现在一种非常重要的方式上是不同的:为了观察主题,没有实例化实际的观察者。相反,主体向各种中央存储库发送通知。此存储库配置了所有已安装和激活插件(观察者)的列表,并包含每个插件希望接收的所有事件的列表。每个插件只在事件发生时被通知,通常是通过静态方法,而不是通过创建插件的实例并通知它。call_user_func_array和一个好的自动加载器使这件事变得极其琐碎。

因此,您可以为所有要实现的插件创建一个简单的接口。您需要的方法包括但不限于:

  • 获取有关插件的数据的东西,如插件的名称、作者、官方网站、版本等。
  • 返回插件想要订阅的事件的方法。
  • 一种安装方法,用于插件为了安装自己而需要做的事情,例如操纵数据库。
  • 卸载方法可能也很方便。
  • 接收事件通知并返回所需数据的(可能是静态的)方法。

根据您对插件概念的理解程度,您可能最终会得到具有用户可配置选项的插件。你可能需要考虑到这一点。在这条道路上,存在着疯狂和配置系统。

为了使插件有效,您需要在任何地方放置钩子,并且经常与终端用户合作,在需要的地方添加新的挂钩。

小部件可以很容易地以类似的方式工作,就像在页面呈现之前调用的插件一样。

主题/模板,哦,我的。你可能有两大选择。

  1. Smarty或者类似的模板引擎。或者你自己的非PHP模板引擎。
  2. PHP模板。

此决定将由您的最终用户驱动。Smarty是令人难以置信的限制,但是如果您想确保只有经过批准的代码在模板中运行,这可能是一个可行的选择。此外,允许在应用程序本身中编辑Smarty模板并不不安全。

另一方面,Wordpress模板工作这么好的原因之一是它们是纯PHP。他们可以调用Wordpress API中公开的任何方法,甚至可以执行自己感兴趣的逻辑。如果您期望您的最终用户具有技术头脑,或者至少在技术上有能力,那么PHP模板就是方法之一。另一方面,如果恶意用户进入管理位,允许在应用程序中编辑PHP模板可能会打开一个巨大的潜在安全漏洞。您可能希望将编辑限制在文件系统上。

虽然这涉及HTML创建,但您也应该考虑CSS。你的最终用户能直接操作CSS吗?他们愿意吗?如果您的默认模板包含了足够多的语义类,那么如果它们知道自己在做什么,那么它们很可能只需付出很大的努力就可以完成大量的样式设计。另一方面,你的终端用户可能不知道CSS是什么,所以他们可能想要,哦,比如说,颜色选择器和预先构建的颜色方案,以及一个配色方案选择器,以及其他一些烦人的东西。最好现在就想想那些恐怖。

各种各样的东西。

没有草案和发布状态的概念,任何CMS都是不完整的。这里我对你没有任何建议,只是先写一下代码。如果您的客户或最终用户想要任何类型的历史存档、管理审批机制,或者任何其他使草案/发布成为简单状态字段的内容,那么您需要尽快了解。)我被这个咬得很厉害。我们围绕一个简单的发布/未发布的模型设计了整个系统,并通过规范构建和相关的原型代码获得了大约9/10的数据,当我们意识到它不能工作时,我们必须做一些远比现在复杂得多的事情才能真正满足客户的需求。重建这个粗略的计划是迄今为止我们所遇到的最大的时间浪费。)

你会用ORM吗?如果没有,请确保使用适当的数据库接口库。或者是梨子里的东西,或者是Zend_Db。您将不可避免地有一个客户坚持代码在Oracle或MSSQL上运行。或SQLite.告诉他们这是可以做到的(付出一些努力),这将是一件好事。插件作者将感谢您的理智以及。别自己翻滚。

(再说一次,根据你的代表水平,我想你已经对我所说的一切都很熟悉了。啊,当我思考我自己的编码问题时,我所做的让自己分心的事情.)

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3356376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档