php – 这个代码是疯了吗?

我遵循一个教程,我认为是由不知道他在做什么(已经捕获2个明显的错误,其余的代码是杂乱的)的人写的。但我不想完全抹杀那个家伙,所以我在这里问一些我不明白的东西。

First of all, I will send 100 brownie points,
my 2 pets, and a box of chocolate to
whoever can explain to me what is
going on with this code.

他使用基于模块的架构。模块名称是前端模块。模块有MVC。模块有自己的内部库。

  /modules/    
      /frontmodule/
          /models/
          /views/
          /controllers/        -- the /module controller is here (undestandable)
          /library/            
             /Controller/      -- the /module/library controller is here (why?!)
                /Action/

首先是混乱的部分。为什么每个模块都有一个内部库,为什么intenal库有自己的控制器和操作。这是最佳做法吗?我认为这个库可以移动到模块可以使用的插件。不确定..

现在有趣的部分….除了每个模块都有自己的内部库,还有一个共享库由所有模块共享(见下面在同一文件夹级别为/ modules),并且Common库也有自己的控制器和操作(就像每个内部库都有自己的控制器和操作一样)

  /modules
  /library/
      /Common/
          /Controller/         -- the /common/library controller is here (why?!)
              /Action/
                  /Helper/
              /Plugin/

所以我们有3个控制器:

>模块控制器
>模块内部库的控制器
>公共库的控制器

现在这里的疯狂部分,我认为是过于复杂的生活

He says: A module controller extends the
module’s library parent controller
which also extends the Common library
controller.

class IndexController 
       extends Frontoffice_Library_Controller_Action_Abstract { ... }

abstract class Frontoffice_Library_Controller_Action_Abstract 
       extends Custom_Controller_Action_Abstract { ... }

所以我猜:

>模块控制器= IndexController
>模块内部库的控制器= Frontoffice_Library_Controller_Action_Abstract
>通用库的控制器= Custom_Controller_Action_Abstract

其中模块控制器扩展模块内部库的控制器

和模块内部库的控制器扩展了公共库的控制器

有没有人看到过这样的事情?我的猜测是,这个代码不会容易维护,但也许那些更有经验的zend可以告诉我这家伙正试图实现。应用程序结构有点太乱。我认为他滥用MVC,而不是使用它来简化应用程序及其可维护性。

Zend Framework的伟大之处在于它是use-at-will,这意味着你可以使用单个组件,或者你可以使用它们。大多数组件也通过配置或扩展(继承或组合,ZF有利于后者)非常灵活。

Zend Framework MVC是非常灵活的…甚至到许多人指责它被过度设计或or肿本身的点。这是主观的。

当然,你可能不会想使用Zend Framework的一个简单的联系人窗体;然而,没有什么阻止你使用Zend_Mail和Zend_Form没有Zend MVC /应用程序。考虑到灵活性,目前没有单一的方法被称为在将应用程序组织成模块方面的最佳方法。这是一个任务最好留给实施者。

这带给我们手头的教程。教程作者已经提出了一个重用策略。这是一件好事;然而,他的方法有一些缺陷。

>每个模块一个库。
  这不一定是坏的;然而,在大多数情况下不是必需的。让我们探讨一下我们有什么选择,如果这种结构需要某种原因。

一个。构建一个通用库(你很可能已经这样做)命名空间(如果< 5.3或者假如> = 5.3的实际命名空间)。

b。利用内在的“资源自动加载器”
      http://framework.zend.com/manual/en/zend.loader.autoloader-resource.html

注意:我个人没有使用资源自动加载很多。一次我使用它,我发现我可以把这些项目到我的图书馆。话虽如此,有这样的用途。当你期望在项目之间混合和匹配模块或分配时,它似乎闪耀着。 ZF2将解决这个在一个不太lessy的方式IMHO。
>基本控制器可重复使用。
  再次,重用是伟大的;然而,Zend Framework提供了更好的替代子类(继承)控制器。首先,这里有一些原因不使用控制器继承:

一个。当你有多个模块,每个模块需要一个基类,但是功能被复制/粘贴到每个模块的基本控制器类中时,保持事物DRY失败。

b。变得难以管理继承的属性,因为难以可视化每个控制器/动作正在使用哪些继承的功能

C。使用PHP只允许单个类继承,你吹一个机会继承这里 – 使用这只有如果没有其他选项离开

备择方案:

一个。前端控制器插件
      当功能/逻辑需要在每个请求上运行时使用这些,而不管模块/控制器/动作

b。行动帮助
      正如ZF项目负责人所说,“它们是Zend Framework中的一个内置机制,允许您以使用组合而不是继承的方式扩展操作控制器。
      在控制器中你不能做任何事情,你不能通过动作助手做。
      当功能需要在每个控制器和/或操作的基础上发生时,使用这些。

那么,教程中的示例是否过度设计?不必要;然而,它肯定是一个错误工程的候选人,因为它涉及Zend框架给出的最佳实践和规定。

我需要离开一会儿,讨论一下过度设计和and肿的术语一会儿

当有人告诉你,事情是过度设计和/或or肿没有说明上下文,请带一粒盐。

维基百科文章 – http://en.wikipedia.org/wiki/Overengineering读取部分“…当一个产品比它的应用程序更强大或复杂的必要…”。

所以,当提到过度工程/ /肿的时候,应该小心地限定手头上下文或应用程序。毯子的陈述应该带一粒盐,在大多数情况下,根本不采取。这类似于说“我不会使用’圆锯’的木工,因为它有太多的功能,这些功能混淆我”。当然,这个工具可能会过度杀死小家庭/旁边的项目;然而,因为它是超级灵活,你会很高兴你有这个工具,当你发现自己在你从来没有想到你会发现自己的情况。

是的,大多数网络框架是过度杀死一个简单的CRUD应用程序,如联系页面,甚至一个简单的博客应用程序。不幸的是,大多数Web框架使用博客示例作为它们的介绍性示例 – 去图。

额外信息:

>如果要根据模块/控制器/操作切换布局,可以编写前端控制器插件。只需调用“Zend_Layout :: startMvc”并传递一个布局名称和路径。
>基于Accept标头(或URL参数或X-HTTP-METHOD-OVERRIDE标题)切换实际视图脚本可以使用上下文切换操作助手(Zend Framework内置) – http://framework.zend.com/manual/en/zend.controller.actionhelpers.html
>随意将模型实例传递给动作辅助程序。您还可以使用引导程序中的配置来配置操作辅助程序。这样,没有必要在全局注册表中存储只是一个荣耀的全局变量的东西。这是一个隐藏的依赖关系,你不需要。为了最好的重用,可以通过扩展Zend_Application_Resource_ResourceAbstract – http://framework.zend.com/manual/en/zend.application.core-functionality.html#zend.application.core-functionality.resource-resourceabstract来创建自己的自定义插件资源

翻译自:https://stackoverflow.com/questions/3740219/is-this-code-insane

转载注明原文:php – 这个代码是疯了吗?