软件开发中常见的一种弊病是“非我发明”综合症,即倾向于编写新的实现,而不是利用现有的解决方案。然后,我们只是将其作为当前构建的应用程序的一部分编写,认为这是一件小事。随着时间的推移,随着新功能的添加,此类辅助类或实用程序类会不断增长,但通常仍与应用程序紧密耦合。
这种弊病也适用于内容管理应用程序。通过选择 CMS,您不仅需要接受其编写所用的语言,还需要接受其编辑和管理界面、模板系统、支持的数据库等等。解耦内容管理 运动 旨在改善这种情况。
专注于附加值
利用现有解决方案通常需要开发人员付出更大的初始努力,但从长远来看,社区会因可重用的组件而变得更加丰富,这些组件专注于真正出色地完成一项任务,而不是每个应用程序都有自己平庸的相同事物的实现。
使用第三方组件也创建了边界,这使得更容易将它们换成不同的或定制的实现。Node.js 生态系统正在将此推向极致,许多软件包仅包含一两个文件。
在更粗粒度的层面上,PHP 世界也发生了同样的事情。看到主要的 CMS 系统专注于其 CMS 功能并利用框架来拥有坚实的基础,这是非常有希望的。ezPublish 5 是基于 Symfony 2 全栈框架构建的。Drupal 8 利用了许多 Symfony 框架组件。Typo3 走向了相反的方向,将其 框架 分离出来并单独发布。
尽管如此,所有这些系统都耦合到一组特定的数据库,并且为了它们的存储而承载了大量的重量。
内容仓库
以内容为中心的应用程序对其存储后端有很高的要求。内容仓库的想法是将内容存储逻辑与实际应用程序解耦。内容仓库提供了比传统数据库更高层次的抽象。它可以独立于应用程序进行改进,并提供高级功能,如搜索、版本控制、文档级别的访问控制等等。
在应用程序和仓库之间建立清晰的边界允许将一个仓库换成另一个仓库。
对于 Java,在 JSR-283 中指定了 Java 内容仓库 (JCR)。JCR 定义了内容仓库的 API(而不是协议)。参考实现是 Apache Jackrabbit,在 Adobe Experience Manager 和 Magnolia CMS 中使用。
JCR 已被移植到 PHP,成为 PHPCR。PHP 实现 RFDa 方法 由 Henri Bergius 提出,使用语义信息注释前端内容,以允许客户端编辑系统识别页面的哪些部分是可编辑的以及如何将其存储回去。借助 Javascript 库,这允许在前端以真正的 WYSIWYG 方式实现无缝的内联编辑。
用于存储更改的后通道是异步 Javascript 发送 JSON-LD 数据。Bergius 编写了 Create.js 来演示这个想法。Create 利用 backbone 存储数据,并使用 HTML5 contenteditable 元素来加载 WYSIWYG 编辑器的选择。Create 还处理集合以添加或重新排序项目,并支持工作流和插件。
解耦内容管理系统只需要使用 RFDa 注释内容,并为 JSON-LD 请求提供端点。
一个说明案例:Symfony CMF
Symfony 内容管理框架 是一项倡议,旨在以完全解耦的方式为 Symfony 框架提供内容管理。它利用 PHPCR 作为内容仓库,Create.js 用于编辑。即使框架本身也被拆分为小的组件,允许混合搭配的方法,只使用有意义的东西。这也使得 CMF 成为构建自定义内容管理系统的良好基础。有了提供的基本构建块,开发可以专注于特定用例所需的任务。
这种方法是为了解决框架与 CMS 困境而提出的。与其编写锁定在特定 CMS 应用程序中的自定义应用程序,或者不得不重新发明基本的 CMS 功能,不如建立清晰的边界来替换 CMS 中与标准案例不同的部分,并使用自定义实现。
CMS
本文是 Robin Muilwijk 协调的 “开放 CMS 专栏” 的一部分。分享您在使用开源内容管理系统 (CMS) 和平台(如 Drupal、Joomla、Plone、WordPress 等)方面的故事。
1 条评论