【问题标题】:PHP - Functions from the controller in viewPHP - 视图中来自控制器的函数
【发布时间】:2012-08-04 23:19:23
【问题描述】:

我正在尝试学习 MVC 模式,(但没有模型,因为当我拥有控制器时,我看不到它们可以用来做什么)。

所以我想在我的视图中显示一些内容。我该怎么做?

这是我处理索引的控制器:

<?php

class Index extends Controller {

    function __construct() {
        parent::__construct();
        $this->view->render('mainpage/index');
    }

    public function wynik($arg) {
        echo $arg;
    }
}

$klasa = new Index();

?>

我想在我看来调用函数 wynik($arg)。我怎样才能做到这一点?我的控制器库如下所示:

<?php

class Controller {

    function __construct() {
        $this->view = new View();
    }

}
?>

在views/mainpage/index.php中我正在尝试这样的事情:

<?php
echo $klasa->wynik('abc');
// tried this too:
$this->wynik('abc');
?>

但它不起作用:

注意:未定义变量:第 2 行 C:\wamp\www\lvc\views\mainpage\index.php 中的 klasa

致命错误:在第 2 行对 C:\wamp\www\lvc\views\mainpage\index.php 中的非对象调用成员函数 wynik()

这是视图库:

<?php

class View {

    function __construct() {

    }

    public function render($name, $noInclude = false) {
        if ($noInclude == true) {
            require 'views/' . $name . '.php';
        } else {

            require 'views/header.php';
            require 'views/' . $name . '.php';
            require 'views/footer.php';
        }
    }

}

?>

我在想 - 是的,它在 View() 类中搜索 wynik() 函数,这就是它出错的原因。我希望视图在我的控制器中搜索功能。我该怎么做?

【问题讨论】:

  • 但没有模型。那你为什么不叫它VC呢?
  • 不要这样做。您正在击败 MVC 的全部要点。控制器逻辑不在视图中。
  • @hakre - 我现在称它为 LVC(库、视图、控制器)。还有 meagar - 我读了很多关于模特的文章,但我就是不明白。当我有控制器时为什么要使用模型?只是更多的代码....但是我确信如果我学习如何使用控制器和视图,我也会学习如何使用模型。
  • View的render方法中的代码是什么?
  • 我想我们已经到了 MVC 代表“我的代码”的地步。

标签: php oop model-view-controller


【解决方案1】:

此代码示例不起作用,因为当您尝试引用它时变量 $klasa 不存在。通过调用“new Index()”完成的对象初始化必须首先完成,然后将该值分配给$klasa。因此,您的代码试图在 $klasa 存在之前访问它。

也就是说,我不会继续调试这个问题。您完全忽略了 MVC 的要点,并且在您理解它之前,您将无法编写一个控制器和视图,它们可以很好地协同工作。花时间了解 MVC,而不是通过自己实现它,而是通过使用另一个系统作为示例。

如果你喜欢 PHP,试试 Yii、CodeIgniter 或 Symphony 框架。如果你喜欢 Python,试试 Django。如果你喜欢 Ruby,试试 Rails。如果你喜欢 C,学习 Objective-C 并尝试 iOS。

MVC模型很简单:

  1. 模型- 这是您的数据存储位置。
  2. 查看- 这是您的数据向用户展示的方式。
  3. 控制器- 这是您的视图与之对话的对象,以便它可以作用于模型。

让我们以一个简单的冰淇淋自动售货机为例。假设自动售货机是其中一台机器,就像这台一样,您看不到商品:

  1. 型号- ACTUAL 冰淇淋存放在后面。比方说,4 巧克力,1 草莓,3 香草。视图和控制器并不关心每个冰淇淋有多少。例如,模型的工作是跟踪这一点,并确保我们的插槽中没有负面冰淇淋或其他不合理的东西。
  2. 查看- 这些小按钮显示存在哪些冰淇淋可供选择。视图不知道也不关心后面有多少冰淇淋,或者甚至存在什么冰淇淋。它只是向用户展示与模型相关的内容,而不关心模型中的内容或模型的结构。
  3. 控制器- 当用户与视图交互时(即,他们按下按钮),控制器将接受该输入并由模型运行它。控制器不关心模型的结构,它不知道后面有什么。它只知道“当用户按下按钮时,我需要使用模型中的数据根据​​该输入做出决定”。例如,当用户按下库存中的有效商品时,控制器接受该输入,由模型运行它,看到它没问题并分配冰淇淋。当用户按下无库存的无效商品时,控制器会接受该输入,由模型运行它,发现它已无库存,并告诉视图显示错误。

如果您了解这个基本概念,整个 MVC 将变得更有意义,并显着加快开发时间。了解 MVC 可能是目前新兴 Web/移动开发人员最重要的事情之一,因为大多数流行的 Web 框架(Django、Rails、Yii/CodeIgniter/Symphony)以及 iOS 都是基于它的。

【讨论】:

    【解决方案2】:

    MVC 是一种结合了两层的设计模式:

    • 模型层
    • 表示层

    如果您的应用程序没有模型层(包含所有领域业务逻辑),那么就没有 MVC。


    表示层主要由两组结构组成:视图和控制器。

    • 控制器:负责对用户的输入做出反应,并在此基础上更改模型层和视图的状态。

    • views :负责显示(或表示)逻辑,基于信息,该视图已从模型层接收。根据这些信息,视图选择适当的响应 - 它可以只是一个 HTTP 标头或 HTML 文件,从多个模板呈现或格式化的 JSON/XML 数据。

    但你也没有真正的意见。你所说的“视图”其实就是简单的 PHP templates

    关于视图访问控制器的方法,它违反了 MVC 和 MVC 启发模式中的所有原则。 View 是一个独立的实体,它从模型层获取数据并由控制器改变状态。

    在经典 MVC 和 Model2 MVC 模式中,视图处于活动状态。它直接从模型层请求信息。而在 MVP 和 MVVM 模式中,视图是被动的,来自模型层的信息由控制器提供(尽管在这些模式中它们分别称为“演示者”和“视图模型”)。

    视图不使用控制器。

    请在你开始抛出术语之前做一些研究,因为你认为这是最新的东西

    阅读以下材料:

    【讨论】:

    • 我不关心这些条款,我只想显示链接中的 /controller/function/value,而且有人告诉我这就是 MVC 的用途:/
    • @MichałKról ,不要将 routing of request 与 MVC 模式混淆。它们是分开的东西。路由发生在您的代码命中 MVC 三元组之前。
    【解决方案3】:

    我建议您使用另一个称为 Transaction Script 的概念,而不是 MVC,而不是真正知道为什么等等>应用程序控制器。

    使用 事务脚本 可以让您更熟悉 OOP,同时您还可以从某些应用程序结构中受益,而不会产生被误解的 MVC 所带来的开销和问题。

    例如,在事务脚本对象中,一切都可以访问该事务的功能。您的库、您的视图和其他所有内容(模型)。

    然后你会看到事情的发展。但是忘记 Codeigniter 和类似的东西,从头开始编写(不要模仿),你会学到更多,你会拥有更高效的代码。

    你会按照自己的方式去做,这对学习很有帮助。

    对于库,只需从 Packagist 和 Pear 存储库中获取内容,您将不会有太多的愿望。

    【讨论】:

      【解决方案4】:

      我不打算在这里添加代码示例,但我希望我所说的能帮助您找到正确的方向。 LVC(库、视图、控制器)只是您将一个名称(模型)更改为另一个(库)根本不重要,您仍在使用 MVC,您只是碰巧将您的模型称为库。这是一个很大的话题,但我只是想让您了解使用模型并将代码卸载到其中而不是在控制器中。

      查看方式是这样的:

      • 通常,控制器应该只执行以下操作 - 检查请求、调用模型(在您的情况下为库)方法来处理这些请求,然后获取这些结果并传递给视图进行渲染。将控制器中的每个函数视为用户可以在地址栏中键入并访问的端点 URL。

      认为您在名为 user 的控制器中有一个类似于 profile($user_id) 的功能,用于显示用户配置文件,并且用户使用 URL www.mydomain/user/profile/1234 访问它。这一切都很好。但是如果你开始在这个控制器中加入各种实用函数,比如strip_all_zeroes(),会发生什么。如果用户可以使用 mydomain.com/user/strip_all_zeroes 访问它,那会变得很糟糕,对吧?它可能会开始抛出各种警告、错误,甚至暴露敏感数据。这就是模型的用武之地。它们可用于创建各种辅助函数,根据需要创建整个数据类。

      当然,这非常宽泛、过于简单且不完全准确,但我希望你能明白..

      【讨论】:

      • 哦,这解释了很多。谢谢你。因此控制器具有处理请求的功能(方法),而不是用于(例如)前端。我明白了:D
      • 控制器就像把所有东西粘在一起的胶带,模型只关心拥有应用程序核心功能所需的所有功能——比如从 db 获取价值, db,发送电子邮件,处理表单等等等。视图,应该只尝试呈现控制器给它的数据(它从模型中获得)。希望我的解释能帮助你了解 MVC ......跨度>
      • @Raidenace:你如何解释你的世界中的View-Model这个词?
      • @hakre:我不明白你的上下文,你是在视点/MVVM 方面询问 View-Model 还是在询问它们在 MVC 中的具体关系?
      • 在您的回答中,听起来库和视图之间没有太大区别。正如您所写的那样,库是一个模型,看起来您同样在说视图也是一个模型。所以我在问你如何将你在答案中概述的世界中的视图和模型联系起来(因为你已经打破了常见的 MVC 定义,我没想到你现在会坚持更多差异化的 MVC 范式,比如 MVVM 等)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多