【发布时间】:2012-05-21 07:01:49
【问题描述】:
我正在尝试了解 MVC,并学习 CI 框架。我有一些关于 MVC 的问题和一些关于 CI 的基本问题。
1)当我从教程中阅读时,视图是应用程序的可视化部分,我的问题是:例如,有一个“登录”按钮,但如果用户已经登录,按钮将是“注销”。登录检查在哪里?在控制器上还是在视图上?我的意思是
//this is view//
<?php if($_SESSION('logged') == true):?>
<a href="logout">Logout</a>
<?php else: ?>
<a href="login">login</a>
<?php endif; ?>
或
//this is controller//
if($_SESSION('logged') == true)
$buttonVal = 'logout';
else
$buttonVal = 'login';
//and we pass these value to view like
$this->view->load('header',$someData);
//this time view is like
<a href="<?=$somedata['buttonVal']?>"><?=$somedata['buttonVal']?></a>
我只是写这些代码作为示例,我知道它们不会工作,它们是虚构的代码,但我想你明白我的意思。登录检查应该在控制器上还是在视图上?
2) 模型应该只包含有关数据的代码并将它们返回给控制器吗?例如有一个数学,我们从数据库中获取 2 个值并将它们相乘并显示它们。模型会成倍增长还是控制器会成倍增长?
在这里,我们使用模型加载数据并在控制器上进行数学运算: //模型
$db->query(....);
$vars=$db->fetchAll();
return $vars;
//controller
$multi = $vars[0] * $vars[1];
$this-load->view('bla.php',$mutli);
这里我们使用模型加载数据并对模型进行数学运算,控制器只是将数据从模型传递到视图:
//model
$db->query(....);
$vars=$db->fetchAll();
$multi = $vars[0] * $vars[1];
return $multi;
//controller
$multi = $this->model->multiply();
$this-load->view('bla.php',$mutli);
我的意思是,模型应该只做数据库工作并将数据传递给控制器,控制器做剩下的工作并将视图发送到渲染?或者模型确实有效,控制器获取它们并将它们发送到视图?
3)这是关于codeigniter的,我有一个必须在每个页面中的标题,但它有javascripts,css取决于我正在使用的页面
<?php foreach ($styles as $style): ?>
<link id="stil" href="<?= base_url() ?>/css/<?= $style ?>.css" rel="stylesheet" type="text/css" />
<?php endforeach; ?>
这将在每个页面上,所以在我拥有的每个控制器中
$data['styles'] = array('css1','css2');
$this->load->view('header', $headers);
我正在考虑做一个主控制器,在里面写这个,我所有的其他控制器都会扩展这个,我在 CI wiki 上看到了 MY_Controller,这个 MY_Controller 和我正在做的一样吗?有没有其他方法可以做到这一点?
对于糟糕的英语和虚拟问题,我们深表歉意。感谢您的回答。
【问题讨论】:
-
由于您使用的是 CodeIgniter,因此您不必担心理解 MVC,因为您将不得不在稍后阶段消除他们对它的所有误解。做现在有效的事。
-
@Gordon 你能详细说明这些误解是什么吗?
-
@Repox 他们的用户指南声称“模型是 PHP 类,旨在处理数据库中的信息”,然后继续显示除了执行 CRUD 之外没有其他目的的类,给人的印象是模型 == 数据库,这是错误的。此外,他们所谓的 ActiveRecord 实际上是一个非常简单的 QueryBuilder。如果您愿意深入了解他们的代码,我相信还有更多内容可以找到。
-
@Repox 如果他们明确指出模型是由附加层组成的层,例如服务层、域模型、持久层等,并且确实是您的应用程序的核心,那么我不会介意CRUD 示例,但没有类似的东西,如果您查看 SO 上的问题,您会发现 CI 用户认为 Model 是一个仅执行 CRUD 的类。至于AR,它甚至不是修改版。 AR 是一个添加了业务逻辑的行对象。他们的修改版本根本不是那样的。我同意有很多糟糕的框架,但 CI 是最糟糕的框架之一。
标签: php model-view-controller codeigniter model