PHP,了解MVC和Codeigniter

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与我正在做的一样吗?有没有其他方法可以做到这一点?

对不起英语和假问题.谢谢你的回答.

Wes*_*rch 5

这绝对是视图逻辑,在我看来这是正确的方法:

 <?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无关,但通常您希望尽可能少地编写代码.冗余表明您可能找到更好的解决方案.这些是广泛的提示(正如你的问题),但希望它有所帮助.