PHP MVC(无框架),我应该在我的控制器或模型中调用很多方法吗?

PHP MVC(无框架),我应该在我的控制器或模型中调用很多方法吗?,php,model-view-controller,smarty,design-patterns,homebrew,Php,Model View Controller,Smarty,Design Patterns,Homebrew,我一直在努力用PHP创建我自己的MVC应用程序,我在网上看到了很多关于如何设置的不同意见。当然,我知道似乎有一种通用的“这是MVC,这是你所能做到的”方法,但我遇到了两种似乎相互矛盾的观点 我的应用程序的一点背景:我使用smarty作为我的演示者和面向对象的方法。看起来很简单,但我正试图找出普遍存在的“什么是模型”问题 如果我看一下一些教程和框架,它们似乎将模型视为从抽象类继承DAL方法的严格类,并在类本身中额外定义了一点,因为对象之间的数据需求不同。例如,我可能会看到类似$productMod

我一直在努力用PHP创建我自己的MVC应用程序,我在网上看到了很多关于如何设置的不同意见。当然,我知道似乎有一种通用的“这是MVC,这是你所能做到的”方法,但我遇到了两种似乎相互矛盾的观点

我的应用程序的一点背景:我使用smarty作为我的演示者和面向对象的方法。看起来很简单,但我正试图找出普遍存在的“什么是模型”问题

如果我看一下一些教程和框架,它们似乎将模型视为从抽象类继承DAL方法的严格类,并在类本身中额外定义了一点,因为对象之间的数据需求不同。例如,我可能会看到类似$productModel->get(5)的内容,它从数据库返回一个包含5个产品的数组。那么,如果我需要查询多个模型呢?我是否将所有数据存储在控制器或数组中并将其传递给视图?那么,如果我动态调用我的控制器,我如何持久化呈现视图所需的控制器特有的数据?这似乎很糟糕,特别是因为我必须传入“controllerName”、“controllerData”之类的内容,并且我的View::render()方法的参数非常多,除非传入控制器本身。也许我错过了什么

假设我想进行一次登录,以查询用户表。登录是一个模型或控制器,这取决于我在网上看到的某些实现。一些实现(我将此方法称为方法1)使用方法login()创建LoginController,该方法可能会比较$\u POST和从用户模型实例$user->get(1)返回的内容,以查看是否验证了用户。或者login()可能是默认控制器中的一个方法。另一方面,一个更像Joomla方法的实现(实现方法2)将创建一个登录模型并声明其中的所有操作。然后,需要分配给视图的任何数据都将从这些方法返回。因此login->login()实际上会检查post,查看是否有匹配项,等等。用户模型可能会在该模型方法中实例化

我对1的感觉:控制器很胖。此外,控制器正在存储从模型中提取的数据或传入一万个变量。这似乎与模型应该向视图传递数据的想法不符,而控制器应该对此视而不见。另外,假设我想将由特定控制器处理的特定模型中的所有内容包装到外部模板中。我必须在与此模型接口的控制器函数中复制此模板设置代码。这似乎效率极低

我对2的感觉是:它不适合非模型方法的操作。如果我想转到我的站点根目录,我必须创建一个索引模型或一些看起来有些过分的东西,以便有一个将数据传递给视图的模型。而且,这似乎不是一个非常流行的方法。但是,我更喜欢它,因为我可以只执行View::render(mymodel->func())并确保数据按我喜欢的方式传回,而不必通过代码将一千个查询结果合并在一起而破坏我的控制器


我经历了太多关于这个的宗教争论,想知道你们怎么想。

我过去也建立了自己的框架,所以我知道你们在经历什么。我听说过“构建胖模型”,我同意这一说法——只要主要目标是返回数据。我认为控制员是“霸主”,因为它操纵数据并指示数据应该去哪里

对于登录控制器,我可能会创建一些类似于

发布URI:

在我看来,数据应该总是来自模型->控制器->视图,因为它最有意义(数据、操作、输出)。视图应该只能访问控制器提供的内容

至于这个

那么,如果我动态调用我的控制器,我如何持久化呈现视图所需的控制器特有的数据

我可以想象你正在构建一个“基本”或“父”控制器,它由你动态调用的控制器扩展。这些子控制器可以具有视图渲染所需的属性——老实说,我需要一个示例来进一步说明


希望这能有所帮助。如果你提出更具体的问题,我可能会给出一个更好的深思熟虑的意见。

我过去也建立了自己的框架,所以我知道你在经历什么。我听说过“构建胖模型”,我同意这一说法——只要主要目标是返回数据。我认为控制员是“霸主”,因为它操纵数据并指示数据应该去哪里

对于登录控制器,我可能会创建一些类似于

发布URI:

在我看来,数据应该总是来自模型->控制器->视图,因为它最有意义(数据、操作、输出)。视图应该只能访问控制器提供的内容

至于这个

那么,如果我动态调用我的控制器,我如何持久化呈现视图所需的控制器特有的数据

我可以想象你正在构建一个“基本”或“父”控制器,它由你动态调用的控制器扩展。这些子控制器可以具有视图渲染所需的属性——老实说,我需要一个示例来进一步说明


希望这能有所帮助。如果你提出更具体的问题,我可能会给出一个更好的想法。

如果你正在编写自己的应用程序,我认为最好的解决方案是自己动手并找出答案

最终,无论什么对你来说最有意义,
LoginController extends ParentController {
  public function authenticate() {
    $credential_model = $this->getModel('credentials');
    // Obviously you should sanitize the $_POST values.
    $is_valid = $credential_model->isValid($_POST['user'], $_POST['email']);
    $view = $is_valid ? 'login_fail.php' : 'login_success.php';
    $data = array();
    $data['a'] = $a;
    // .. more vars
    $this->view->render($view, $data);
  }
}