3

我也在 zfforums 上问过这个问题,但我可能会在这里得到答复。

所以 Zend 框架是一个通用的、灵活的、松耦合的、高质量的框架。但是,我发现一些 MVC 部分不一致且过于复杂。希望你们中的一些人可以证明一些 zf 设计决策的合理性并回答一些问题:

一般问题/评论

  1. 为什么 zend mvc 不遵循与其他 zend 组件相同的命名约定?例如,mvc 使用小写,复数目录名和类名不以目录信息为前缀,因此它们不容易自动加载。

  2. 我想要添加模块根目录的选项。这样,我就不必通过添加控制器/模块目录来显式配置调度程序。我可以放入一个模块并立即访问它。

  3. 为什么视图和动作助手之间有区别?目前,帮助程序并未设计为在整个代码中共享,并且加载和访问帮助程序的方法不一致。其他框架允许您在代码中的任何位置共享相同的助手。我认为没有必要专门化和违反 DRY。

Zend 查看问题

  1. 为什么视图使用“$this”来访问资源?我认为不需要额外的打字。其他一些框架 extract() 一组视图变量,并允许从视图中加载全局函数或自动加载静态助手: myHelper::someMethod();

  2. 为什么视图助手每个类只允许一个函数?这导致了很多类和相关的维护。如前所述,我更喜欢具有任意数量方法的静态类。

4

2 回答 2

5

我在一个巨大的 Intranet 站点中使用 Zend Framework,因为它处于早期阶段,我认为是 0.3 或 0.4,并且我遵循了关于您的问题的大部分决定。我会试着解释一下:

  1. 在大多数情况下,您不需要使用模块。您可以将所有控制器放在您的application/default目录中,命名它们,IndexController或者HelpController您已经完成,只需访问http://www.domain.com/http://www.domain.com/help

    如果您的项目开始增长,您可以根据需要添加模块,以模块名称(目录名称)作为前缀,Admin_IndexController或者Forum_PostController通过http://www.domain.com/admin(您在admin模块、index控制器中;不在default模块/admin控制器中)访问它们。

  2. 例如,您可以将模块目录设置applicatoin/modules为 ,并将 FrontController 配置为在此目录中查找模块。使用addModuleDictory每当您创建一个新目录并将您的视图/控制器放在那里时,调度程序都会自动发现它们。是一个例子。

  3. 正如我所看到的,它们具有明显不同的目的。ViewHelpers 用于生成标记并直接在视图中渲染其他操作,抽象菜单创建、侧边栏等。 OTOH ActionHelpers 与调度过程交互,允许您重定向到另一个操作,例如。

意见

  1. 一开始我也觉得有点别扭,但习惯了。我认为主要原因是不污染命名空间,但我可能错了。顺便说一句,我不是很喜欢使用extract(),但这只是我个人的喜好。

  2. 主要原因是每个文件不允许有多个控制器:自动加载。当您使用$this->someViewHelper() 底层引擎时,会查找*_SomeViewHelper_Helper插件路径中命名的类。另一个原因是静态类很难进行单元测试。甚至有人提议将 FrontController 重写为实例类,而不是 Singleton。

您在第二段中所说的过于复杂的部分是正确的,开发人员和社区都知道这一点。它必须以这种方式适应所有要求和变化。

最后,我认为 ZF 是一个非常强大的框架,让我们可以自由地做我们想做的事。

我希望我能帮助你解决你的问题。

于 2009-03-28T01:26:11.750 回答
2

我不知道这些问题的所有答案,但它们是有趣的问题,所以我会试一试,希望有人能填补空白。

一般的

  1. 不在默认模块中的类以模块名称为前缀,例如 Admin_IndexController 并将驻留在 /admin/controllers 中。我认为分离和命名不一致(与库类相比)的原因是,将它们放在嵌套文件夹结构中几乎没有什么好处。控制器是您实现的一部分,所以我个人认为这是有道理的。然而,遍历文件夹确实有点烦人。

  2. 您可以修改调度程序,或编写一个插件来扫描目录并添加它们。

  3. 这里肯定有重叠——URL 助手就是一个很好的例子。通常,视图助手会生成标记,所以我认为有足够大的区别。

看法

  1. 我不知道确切的原因,但我猜它允许其他助手和视图功能更轻松地协同工作。例如,如果您使用 doctype 帮助器来设置 doctype,那么表单元素帮助器可以根据需要生成 XHTML 或 HTML。

  2. 它肯定会导致很多课程,但我不确定维护。我没有遇到任何问题。我可以看到在静态类中的使用,但请记住 Zend_View 不会阻​​止您使用它们。如果您的包含路径中有静态类(并使用 Zend_Loader 或类似的),您可以使用它们来代替 View Helpers 或作为 View Helpers 的补充。

于 2009-03-27T21:39:47.143 回答