代码之家  ›  专栏  ›  技术社区  ›  Don Jones

Zend框架-动态添加“代码模块”或类

  •  1
  • Don Jones  · 技术社区  · 16 年前

    我正在构建一个基于Zend的Web应用程序,允许第三方扩展。

    从本质上讲,这个应用程序的数据库将有一个通用的“内容存储区”。添加扩展来以不同的方式呈现不同的内容。

    想象一个富邮件存储:当用户请求一个“日历”项时,我实例化一个日历类(或其他东西),并要求它呈现该项的内容。同一个数据库可能包含“mail”项,这些项由不同的类(或其他类)呈现。所以,我基本上用处理内容项所需的方法定义一个基类,然后编写从中继承的外接程序来处理特定的项类型。

    这些外接程序中的每一个都可能需要访问自己的视图文件,因为它们中的每一个显然都有不同的视觉布局。

    我无法预见可能会使用的所有内容呈现器;新的内容呈现器将“安装”(以某种方式),以便我的应用程序知道“当我看到数据库类型列为xyz的内容时,我将调用xyz来呈现该内容。”

    很可能会发生这样的情况:用户将访问应用程序的URL,从而触发控制器内的操作。该控制器将使用一个模型方法,告诉它请求了哪个特定的内容项。

    从那里,模型或控制器(哪个?)需要打电话(什么?)它从数据库中获取该项(好的,模型显然会这样做),并使用预定的视图进行呈现。这将是一个更大的页面的一部分,该页面可能包含多个呈现项(如中的内容项列表)。

    所以有两个问题:

    • 在Zend框架中,最好的方法是什么?我 希望这些外接程序继承我提供的基本呈现器类,因为非常简单的呈现器可能只需要从该基本类调用功能,而不需要自己的代码(例如,“note”和“memo”可能很好地使用基本呈现器类的简化呈现功能)。

    • 在我的应用程序中“注册”这些外接程序的最佳方法是什么?一个.ini文件,也许是一个数据库表?目标是为操作应用程序的人简化安装步骤,例如,编辑.in i文件通常比手动查询数据库容易,尽管我也可以为要注册的新内容呈现器提供管理后端UI。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Bill Karwin    16 年前

    我会执行 Visitor Pattern 为此。

    每个第三方扩展应实现 界面 你定义的,这样你就知道你可以调用一个特定的方法,比如 render() 在作为接口实例的任何对象上。

    然后,每个扩展实现自己的呈现。也许它利用了 View partial 在Zend框架架构中。或者,它可能使用一些完全不同的代码将自己呈现为PDF或其他东西(也许每个扩展都需要能够覆盖内容类型头?).

    关于如何注册它,请查看Zend_应用程序框架以定义 resource plugins .