【发布时间】:2010-11-02 02:38:50
【问题描述】:
我一直致力于在 PHP 中创建自己的 MVC 应用程序,我在网上看到了很多关于应该如何设置的不同意见。当然,我知道似乎有一种通用的“它是 MVC,它就是你所创造的”方法,但我遇到了 2 个看似相互矛盾的观点。
我的应用程序的一些背景知识:我使用 smarty 作为我的演示者和面向对象的方法。看起来很简单,但我正试图弄清楚无处不在的“什么是模型”问题。
如果我看一些教程和框架,他们似乎将模型严格地视为从抽象类继承 DAL 方法的类,由于您的数据需求与对象不同,因此在类本身中定义了一些额外的反对。例如,我可能会看到类似 $productModel->get(5) 的东西,它从数据库中返回一个包含 5 个产品的数组。那么如果我需要查询多个模型呢?我是否将所有数据存储在控制器或数组中并将其传递给视图?那么如果我动态地调用我的控制器,我怎样才能持久化渲染视图所需的控制器特有的数据呢?这似乎很糟糕,尤其是因为我必须传入诸如“controllerName”、“controllerData”之类的东西,并且我的 View::render() 方法会因参数而变得非常臃肿,除非我传入控制器本身。也许我在这里遗漏了一些东西。
假设我想创建一个查询用户表的登录。登录是一个模型或一个控制器,这取决于我在网上看到的某些实现。一些实现(我将调用此方法 1)使用方法 login() 创建一个 LoginController,它可能会比较 $_POST 和从用户模型实例 $user->get(1) 返回的内容,以查看用户是否经过验证.或者 login() 可能是默认控制器中的一个方法。另一方面,更类似于 Joomla 方法的实现(实现方法 2)将创建一个登录模型并在其中声明所有操作。然后,需要分配给视图的任何数据都将从这些方法返回。所以 login->login() 实际上会检查帖子,看看是否有匹配等。此外,用户模型可能会在该模型方法中实例化。
我对1的感受:控制器很胖。此外,控制器存储从模型中提取的数据或传入一万个变量。这似乎与模型应该将数据传递给控制器应该视而不见的视图的想法不符。另外,假设我想将由特定控制器处理的特定模型中的所有内容包装在外部模板中。我必须在与此模型接口的控制器功能中复制此模板设置代码。这似乎效率很低。
我对 2 的感受:它不适用于具有不是模型方法的操作。如果我想进入我的站点根目录,我必须创建一个索引模型或一些看起来有点过分的东西,以便有一个将数据传递给视图的模型。此外,这似乎不是一种非常流行的方法。但是,我更喜欢它,因为我可以只执行 View::render(mymodel->func()) 并确保数据将以我喜欢的方式传回,而不必用代码来破坏我的控制器将一千个查询结果合并在一起。
我已经经历了太多关于这个的宗教争论,想知道你们的想法。
【问题讨论】:
-
这属于programmers.stackexchange.com 恕我直言
标签: php model-view-controller smarty design-patterns homebrew