我一直致力于在 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()) 并确保数据将以我喜欢的方式传回,而不必用代码来破坏我的控制器将一千个查询结果合并在一起。
我已经经历了太多关于这个的宗教争论,想知道你们的想法。