1

我正在尝试学习 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() 函数,这就是它出错的原因。我希望视图在我的控制器中搜索功能。我怎样才能做到这一点?

4

4 回答 4

4

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

  • 模型层
  • 表示层

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


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

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

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

但你也没有真正的意见。您所说的“视图”实际上是简单的 PHP模板

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

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

视图不使用控制器。

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

阅读以下材料:

于 2012-08-07T21:57:20.867 回答
4

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

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

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

MVC 模型非常简单:

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

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

在此处输入图像描述

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

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

于 2012-08-07T22:12:38.363 回答
2

代替 MVC 并且不知道为什么等等,我建议您使用另一个称为Transaction Script的概念,它也可以很好地与Frontend ControllerApplication Controller一起使用。

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

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

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

而且您会按照自己的方式进行操作,这对学习很有帮助。

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

于 2012-08-07T21:48:26.653 回答
0

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

看待它的方式是这样的:

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

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

当然,这非常广泛,过于简单且不完全准确,但我希望您能明白这一点..

于 2012-08-07T22:04:54.493 回答