2

我正在尝试了解 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 和我正在做的一样吗?还有其他方法可以做到这一点吗?

很抱歉英语不好和愚蠢的问题。感谢您的回答。

4

3 回答 3

5

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

 <?php if($logged_in):?>
 <a href="logout">Logout</a>
 <?php else: ?>
 <a href="login">login</a>        
 <?php endif; ?>

的值$logged_in可能会从对库方法的调用中检索:

<?php if ($this->auth->logged_in()): ?>

身份验证是您希望全局访问的内容之一,因此您可能$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>

并编写一个用于加载模板的小包装类:

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));
  }
}

在控制器中的用法:

$this->template->load('my_view', $some_data);

这样可以避免重复加载页眉/页脚。在我看来,展示逻辑,如加载哪个 CSS 文件或页面标题应该尽可能属于视图。

就模型而言,您希望它们可重用 - 所以让它们做您需要的事情并使其与数据操作(通常只是您的数据库)严格相关。让您的控制器决定如何处理数据。

与 MVC 无关,但通常您希望编写尽可能少的代码。冗余表明您可能会找到更好的解决方案。这些是广泛的提示(正如您的问题),但希望它有所帮助。

于 2012-05-13T14:28:14.810 回答
-1

1) 如果需要,视图逻辑应该很简单,并且主要是 if-then 语句。在您的示例中,任何一种情况都可以工作,但使用视图中的逻辑。但是,如果您正在检查登录并在未登录时重定向,那么这将发生在控制器(或库)中。

2) 将 Codeigniter 模型视为访问数据库功能的方式 - 创建、检索、更新、删除。对于 Codeigniter 模型,我的(松散的)经验法则是返回更新、删除或插入查询的结果或获取查询的结果集。然后可以在控制器中进行任何适用的数学运算。如果这是每次都会发生的数学运算,请考虑将其添加到库函数中。见下文...

3)扩展控制器是实现此目的的正确和最佳方法。

*) 不要在您的盘子中添加更多内容,但也一定要了解Codeigniter 库。例如,在您的控制器中,您可以加载您的库。然后你从你的控制器调用你的库函数。库函数调用一个模型来检索您的数据库结果。然后库函数对该函数执行数学运算并将结果返回给控制器。控制器只剩下很少的代码,但由于库和模型而完成了很多工作。

于 2012-05-13T14:29:10.410 回答
-2

用户登录检查应该在控制器中。这应该是需要在构造函数中调用的第一个函数。

Below i have given the sample code which redirects the user to the login page if he is not logged in, hope this would give you some idea,

<?php

class Summary extends Controller {

    function Summary() {
        parent::Controller();
        $this->is_logged_in();
    }

    function is_logged_in() {
        $logged_in = $this->session->userdata('logged_in');
        if (!isset($logged_in) || $logged_in != true) {
            $url = base_url() . 'index.php';
            redirect($url);
            exit();
        }
    }

?>

通过检查视图中的会话变量并相应地做出决策,可以在视图中实现按钮更改。

请看这个链接

于 2012-05-13T14:27:38.553 回答