-1

我决定在不使用定义/商业框架的情况下尝试 MVC。我可以处理创建模型和控制器。在我的情况下,这些视图是基本的 html。我唯一看不到的创建方式是控制器加载视图时。

例如在 codeigniter 中,我会使用这个:$this->load->view('view_name');

但如果我正在创建这个功能,它会怎么样?

ps任何说明代码将不胜感激。

4

3 回答 3

1

这是因为,如果你正在实现一些对 MVC 的奇怪模仿,那是受到广泛使用类似 Rails 框架的启发。

视图不是模板。

这是大多数人无法理解的部分。视图应该是实例,负责所有的表示逻辑。他们根据从模型层提取的数据处理多个模板,选择使用哪个模板。

一个视图需要很少的这些模板,并将它们组合起来以创建一个 HTML 响应,或者如果需要,它可以代替 HTML,只发送一个 HTTP 标头。

视图应该从哪里来

控制器不应“加载视图”或“创建视图”。完全形成的视图应该被注入到控制器中,以便它们在某些情况下可以更改该视图的状态。

由于在受 MVC 启发的 Web 模式中,控制器和视图之间存在 1:1 的关系是很常见的。当您创建实例化控制器时,您可以大约在同一阶段实例化具有相同类名(只是不同命名空间)的视图。

如果你有类名,你可以在对应的控制器之前实例化视图。这样您就可以在控制器的构造函数中注入视图实例。

于 2012-11-08T08:39:48.763 回答
1

向您的主控制器添加功能,例如

应用程序控制器.php

function myLoadView($viewname){
    include $config['basepath'].'/views/'.$viewname.'.html';
}

像这样你可以实现

你可以使用喜欢

$this->myLoadView('index');

更新:-

像这样更新函数

  function myLoadView($viewname){
    include $config['basepath'].'/views/header.html';
    include $config['basepath'].'/views/'.$viewname.'.html';
    include $config['basepath'].'/views/footer.html';
}
于 2012-11-08T05:48:19.360 回答
0

就我个人而言,我只会让你的控制器返回一个视图。许多框架都这样做。您可以返回 $this->view('your view class') 或将其命名为 responseView('') 等。然后将任何变量作为数组中的第二个参数传递,以便您的视图可以访问它。

例如:

class SomeController extends Controller {
    public function index() {
        // do stuff

        return $this->responseView('view_name', array(
            'param' => 'value',
            'title' => 'pages title'
        ));
    }
}

然后你的前端控制器将测试它是否返回一个视图以及它是否开始处理响应。

于 2012-11-08T05:49:51.810 回答