Mal*_*xxl 2 php model-view-controller model codeigniter
我正在尝试理解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; ?>
Run Code Online (Sandbox Code Playgroud)
要么
//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>
Run Code Online (Sandbox Code Playgroud)
我只是写theese代码作为一个例子,我知道他们不会工作,他们是虚构的代码,但我想你得到了我的意思.登录检查应该在控制器上还是在视图上?
2)模型是否只包含有关数据的代码并将其返回给控制器?例如,有一个数学,我们从数据库中获得2个值并将它们相乘并显示它们.模型会倍增或控制器会这样做吗?
这里我们用模型加载数据并在controller:// model上进行数学运算
$db->query(....);
$vars=$db->fetchAll();
return $vars;
//controller
$multi = $vars[0] * $vars[1];
$this-load->view('bla.php',$mutli);
Run Code Online (Sandbox Code Playgroud)
这里我们用模型加载数据并在模型上进行数学运算,控制器只是将数据从模型传递到视图:
//model
$db->query(....);
$vars=$db->fetchAll();
$multi = $vars[0] * $vars[1];
return $multi;
//controller
$multi = $this->model->multiply();
$this-load->view('bla.php',$mutli);
Run Code Online (Sandbox Code Playgroud)
我的意思是,模型应该只做数据库工作并将数据传递给控制器,控制器做其余的工作并发送视图进行渲染?或模型可以工作,控制器获取它们并将它们发送到视图?
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; ?>
Run Code Online (Sandbox Code Playgroud)
这将在每个页面上,所以在我拥有的每个控制器中
$data['styles'] = array('css1','css2');
$this->load->view('header', $headers);
Run Code Online (Sandbox Code Playgroud)
我正在考虑制作一个主控制器,将其写入其中,并且我所有其他控制器都会对此进行扩展,我在CI维基上看到一些MY_Controller,这个MY_Controller与我正在做的一样吗?有没有其他方法可以做到这一点?
对不起英语和假问题.谢谢你的回答.
这绝对是视图逻辑,在我看来这是正确的方法:
<?php if($logged_in):?>
<a href="logout">Logout</a>
<?php else: ?>
<a href="login">login</a>
<?php endif; ?>
Run Code Online (Sandbox Code Playgroud)
$logged_in可能会从对库方法的调用中检索到的值:
<?php if ($this->auth->logged_in()): ?>
Run Code Online (Sandbox Code Playgroud)
身份验证是您希望全局访问的内容之一,因此您可能$this->auth->logged_in()出于不同的原因(但可能不在模型中)调用控制器或视图.
在我拥有的每个控制器中
$data['styles'] = array('css1','css2');
$this->load->view('header', $headers);
是的,您可以使用扩展控制器类MY_Controller,但最好将其保留在视图/表示层中.我通常会创建一个主模板:
<html>
<head><!-- load assets --></head>
<body id="my_page">
<header />
<?php $this->load->view($view); ?>
<footer />
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
并为加载模板编写一个小包装类:
class Template {
function load($view_file, $data) {
$CI = &get_instance();
$view = $CI->load->view($view_file, $data, TRUE);
$CI->load->view('master', array('view' => $view));
}
}
Run Code Online (Sandbox Code Playgroud)
控制器中的用法:
$this->template->load('my_view', $some_data);
Run Code Online (Sandbox Code Playgroud)
这样可以避免重复加载页眉/页脚.在我看来,尽可能在视图中加载CSS文件或页面标题应该属于哪个表示逻辑.
对于模型来说,你希望它们可以重复使用 - 所以让它们做你需要的东西,并使它与数据操作(通常只是你的数据库)严格相关.让你的控制器决定做什么用的数据.
与MVC无关,但通常您希望尽可能少地编写代码.冗余表明您可能找到更好的解决方案.这些是广泛的提示(正如你的问题),但希望它有所帮助.