Closed. This question is
opinion-based。它当前不接受答案。
想要改善这个问题吗?更新问题,以便
editing this post用事实和引用来回答。
3年前关闭。
Improve this question
客户端给了我一个新任务,该任务基本上是为 Actor /歌手创建一个CMS,客户端将向他们出售类似的内容。
它基本上将是一个软件包,并且可以像WordPress一样直接使用,您只要将它交给购买它的任何人,但是当然这不会成为博客平台。它将使开发人员能够:
添加插件/小工具添加模板/主题我认为
Observer Pattern可能有用,但是我不确定。你们可能会建议在以下方面创建这种灵活/可扩展的CMS:
能够添加插件(例如WordPress)能够添加主题/模板(例如WordPress)设计模式其他任何东西
观察者很好,但是您将不得不考虑超越基本模式。规范的Observer/Subject模式仅将Subject对象发送给Observer,除此之外,别无其他,甚至不通知其原因。
最初,该解决方案似乎还包括向观察者发送通知的原因,但随后您可能最终通知不关心某些通知的观察者。更好的解决方案可能是要求观察者还要求他们希望接收的通知列表。
但这也带来了一个问题。为了使观察者真正将自己附加到主题上,必须实例化它们。每一次。即使永远不需要它们。真傻
因此,我们很快达到了插件的规范PHP实现之一:“hooks”。 Hook 使用与观察者/主题相同的概念,但是实现方式在非常重要的方面有所不同:实际的观察者并未实例化以观察主题。相反,主题会向各种中央存储库发送通知。此存储库配置有所有已安装和已激活的插件(Observer)的列表,并包含每个插件希望接收的所有事件的列表。每个插件仅在事件发生时通知,通常通过静态方法,而不是通过创建插件的实例并进行通知来通知。 call_user_func_array
和良好的自动加载器使此操作变得异常琐碎。
因此,您可以为所有插件创建一个简单的接口(interface)。您需要的方法包括但不限于:
用于获取有关插件的数据的东西,例如它的名称,作者,官方网站,版本等。人类消耗的信息。 一种方法,返回插件要订阅的事件。 一种安装方法,用于插件为了安装自身而需要做的事情,例如操作数据库。 卸载方法也可能很方便。 (可能是静态的)方法将接收事件通知并返回所需的任何数据。 根据您对插件概念的了解程度,最终可能会获得具有用户可配置选项的插件。您可能需要考虑到这一点。疯狂和配置系统就是这条路。
为了使插件有效,您将需要在所有地方放置钩子(Hook),并经常与最终用户一起在需要的地方添加新的钩子(Hook)。
小部件可以以类似的方式轻松地工作,就像在页面渲染之前调用插件一样。
主题/模板,哦,我的。您可能有两个大选择。
Smarty,或类似的模板引擎。或您自己的非PHP模板引擎。 PHP模板。 该决定将由您的最终用户决定。 Smarty的局限性令人难以置信,但是如果您要确保模板中仅运行经过批准的代码,这可能是一个可行的选择。此外,允许直接在应用程序本身中编辑Smarty模板也不是不安全的。
另一方面,Wordpress模板表现出色的原因之一是它们是纯PHP。他们可以调用Wordpress API中公开的任何方法,甚至可以执行自己有趣的逻辑。如果您希望最终用户具有技术意识,或者至少具有技术能力,则可以使用PHP模板。另一方面,如果恶意用户进入管理位,则允许在应用程序内编辑PHP模板可能会带来巨大的潜在安全漏洞。您可能要限制对文件系统的编辑。
尽管这涵盖了HTML的创建,但您还应该考虑CSS。您的最终用户将能够直接操作CSS吗?他们愿意吗?如果您的默认模板包含足够的语义类,则只要他们知道自己在做什么,它们就可以不费吹灰之力就可以进行很多样式设计。另一方面,您的最终用户可能不知道CSS是什么,所以他们可能想要,例如,颜色选择器和预构建的颜色方案,颜色方案选择器以及其他类似的令人讨厌的东西。现在最好考虑一下这些恐怖因素。
杂项。
没有草稿和发布状态的概念,任何CMS都是不完整的。除了先编写代码外,我这里没有其他建议。如果您的客户或最终用户想要任何类型的历史归档,管理批准机制或其他使草稿/发布内容(除了简单的状态字段)之外的任何其他内容,则需要尽快了解。 (我对此感到非常痛苦。我们围绕一个简单的已发布/未发布的模型设计了整个系统,当我们意识到它不起作用时,通过规范构建和相关的原型(prototype)代码获得了大约9/10的信息,我们需要做的事情要远得多,要复杂得多,才能真正满足客户的需求。重建粗略的计划是迄今为止我们所遇到的最大的时间浪费。)
您会使用ORM吗?如果没有,请确保使用正确的数据库接口(interface)库。 PDO,或者是PEAR的东西,或者是Zend_Db。不可避免地会有一个客户坚持要求该代码在Oracle或MSSQL上运行。或SQLite。告诉他们可以(很费力)的做法很高兴。插件作者也将感谢您的理智。不要自己动手。
(再说一次,对于您的代表级别,我希望您已经对我所说的一切非常熟悉。嗯,在考虑自己的编码问题时,我所做的事情分散了我的注意力……)