我正在构建一个允许第三方扩展的基于Zend的Web应用程序。
本质上,此应用程序的数据库将具有通用的“内容存储库”。添加扩展名以不同方式呈现不同的内容。
考虑一个富邮件存储:当用户请求“日历”项时,我实例化一个Calendar类(或其他东西)并要求它呈现项目的内容。同一个数据库可能包含“Mail”项,这些项由不同的类(或其他类)呈现。所以我基本上定义了一个基类,其中包含处理内容项所需的方法,然后编写了从中继承的加载项以处理特定的项类型。
这些加载项中的每一个都可能需要访问自己的View文件,因为每个加载项显然都有不同的可视布局。
我无法预见可能使用的所有内容渲染器;新的将被“安装”(以某种方式),以便我的应用程序知道“当我看到XYZ的数据库类型列的内容时,我将调用XYZ来渲染它。”
可能会发生这样的情况:用户将访问应用程序的URL,从而触发Controller中的操作。该控制器将使用Model方法,告诉它请求了哪个特定的内容项。
从那里,模型或控制器(哪个?)需要调用从数据库中获取项目的东西(什么?)(好吧,模型显然会这样做)并使用一些预定的视图渲染它。这将是一个较大的页面的一部分,可能包括几个呈现的项目(如,内容项列表)。
所以有两个问题:
在Zend Framework中构建这个的最佳方法是什么?我做希望这些加载项从我提供的基础渲染器类继承,因为非常简单的渲染器可能只需要从该基类调用功能,而不是拥有任何自己的代码(例如,“注意”和“备注”可能会使用基础渲染器类的简化渲染功能。)
使用我的应用程序“注册”这些加载项的最佳方法是什么?一个.ini文件,也许是一个数据库表?目标是简化操作应用程序的任何人的安装步骤 - 例如,编辑.ini文件通常比手动查询数据库更容易,尽管我还可以为要注册的新内容渲染器提供管理后端UI。 / p>
答案 0 :(得分:2)
我为此实施了Visitor Pattern。
每个第三方扩展程序都应实现您定义的接口,以便您知道可以调用特定方法,对任何作为该接口实例的对象说render()
。
然后每个扩展实现自己的渲染。也许它在Zend Framework架构中使用View partial。或者它可能使用一些完全不同的代码将自己呈现为PDF或其他东西(可能每个扩展都需要能够覆盖内容类型的标题?)。
至于如何注册它,请查看Zend_Application框架以定义resource plugins。