【问题标题】:call controller action from a view in php从 php 中的视图调用控制器操作
【发布时间】:2011-05-26 02:04:35
【问题描述】:

在 PHP 中,在没有任何框架的情况下通过 MVC 模式工作时,当页面加载并再次进行 CRUD 处理时,文件应该转到控制器。那么如何将视图页面连接到控制器,因为视图页面像 HTML 一样简单?控制器通过 ActionView 渲染视图页面,因此视图页面将如何链接到控制器以进行 CRUD 处理。

【问题讨论】:

  • 在正确的 MVC 中,您不要从视图调用控制器,因为视图不应该涉及任何业务逻辑。你能更详细地解释你想要做什么吗?
  • 控制器决定将哪个视图返回给用户,而不是相反。
  • 实际上我有表单页面在视图中呈现的 MVC 模式。现在我希望插入后的数据应该存储在数据库中。为此我必须将视图页面连接到控制器所以我可以存储数据或可以做任何杂乱无章的过程。所以你能告诉我怎么做吗。

标签: php model-view-controller


【解决方案1】:

每个 MVC 请求都经过同一个 Controller -> Model -> View cycle。从这个意义上说,每个视图总是“联系”一个控制器,只是不在同一个请求中。

  1. 用户打开网址/posts/add
  2. PostsController 抓取一些数据并呈现视图
  3. 视图由一个表单组成,可能显示来自控制器的一些数据
  4. 最终的 HTML 被发送给用户

一个请求周期到此结束。浏览器显示 HTML 表单。提交表单时,会向服务器发送一个新请求。

  1. 表格已发布到/posts/add
  2. PostsController 抓取数据,使用模型保存
  3. 如果一切正常,控制器会呈现一个 “谢谢” 页面(或其他任何功能)
  4. 如果它不起作用,控制器会再次呈现表单视图,并填充错误消息
  5. 最终的 HTML 被发送给用户

这将再次完成循环。视图从不与 MVC 循环内的控制器对话。它只输出用户看到的 HTML。然后用户向控制器发起一个新的请求。

【讨论】:

  • 是的,我完全同意您的观点,但是控制器如何从视图字段中获取数据?有什么逻辑吗?
  • 我认为您需要先了解 HTML 表单的基础知识。控制器不会从视图中获取数据,而是从 HTTP 请求中获取数据。请先尝试创建一些没有 MVC 的简单 HTML 表单,可能阅读教程。
【解决方案2】:

假设你有以下几点:

/m/User.class.php /v/newUser.php /c/UserController.class.php

我通常将它们分解为 3 层:类中的模型,给定业务对象的封装良好的高内聚类。虽然这个类负责用户的对象模型,但控制器负责实现 CRUD 方法。这使得关注点的简单分离,促进代码重用等。然后,您可以将控制器插入您需要的任何视图,例如“newUser.php”来查看用户。

由于 PHP 是一种脚本语言,您需要在使用前导入依赖项。因此,查看依赖树,我通常使用“require_once”将模型导入控制器,并将控制器导入视图。

User.class.php ----- 类用户{ 私人$用户名;

 User($newUsername) {
     $this->username = $newUsername;
 }

}

userController.php ---------------(考虑到下面的“app”方向是在PHP INCLUDE_PATH变量下)

require_once("app/m/User.class.php");

类用户控制器 {

public static createUser($newUsername) {
    return new User($newUsername);
}

}

newUser.php ----------(考虑到“app”下面的方向是在PHP INCLUDE_PATH变量下)

require_once("app/c/UserController.class.php");

$newUser = $UserController.createUser("username");

echo "<b>" . $newUser;

除此之外,我使用像 Propel 这样的 ORM 系统来为用户提供持久性。在我的硕士课程中,我使用 Propel 和手动 MVC 实现了一个大型 PHP 系统……有关此结构的更完整示例,请访问 http://java.net/projects/infinity-metrics/sources/svn/content/trunk/app/classes/infinitymetrics/controller/UserManagementController.class.php 以获取控制器示例。以下是使用此控制器的视图示例:http://java.net/projects/infinity-metrics/sources/svn/content/trunk/app/user/student/signup-step1.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多