【问题标题】:Is it good to call a model function from a view从视图调用模型函数好不好
【发布时间】:2014-07-23 09:11:45
【问题描述】:

在使用 codeigniter 时,我整理了一件我也可以从视图页面调用模型函数的东西。

举个例子

这是我的示例模型

<?php
class autoload_model extends CI_Model{
    function __construct() {
        parent::__construct();
   }

/*---------data fetching-----------*/
    function get_data_from_table($table,$data,$cond)
    {
        $this->db->select($data);
        $this->db->where($cond);
        $result= $this->db->get($table);
        return $result;
    }
   /*---------ends-----------*/
}
?>

现在在我的视图页面中我已经写了这个

<table cellspacing="1" cellpadding="0">
<tr>
<td>Product Title</td>
<td><Product Price</td>
</tr>


<?php
$product_list = $this->autoload_model->get_data_from_table("td_product","*",
                                                           "product_id > 0")->result_array();

if(count($product_list)>0)
    {
      foreach($product_list as $pl)
         {?>
      <tr>
         <td><?php echo $pl['product_title'];?></td>
         <td><?php echo $pl['product_price'];?></td>
      </tr>
        <?php
         }
     }
    else
     {?>
         <tr>
           <td colspan="2">No data Found</td>
         </tr>
    <?php
     }
}?>
</table>

一切都很好,只是我想知道以这种方式使用它是否好用?

NOTE: 

自动加载模型在 config/autoload.php 文件中自动加载

【问题讨论】:

标签: codeigniter


【解决方案1】:

Codeigniter 是建立在 MVC(模型 - 视图 - 控制器)设计模式之上的 PHP 框架。如果您不遵循此规则,请不要使用框架

【讨论】:

  • 在某些情况下,最好从视图中调用模型函数...假设我想在所有页面中显示一个公共部分,这意味着在所有控制器中我必须将该代码部分用于获取和显示数据...如果我有 51 个控制器,那么我可能需要将该代码添加到 51 个控制器,但如果我将其添加到一个普通的 php 视图文件中,那么我需要的只是在每个控制器中加载视图页面............说我想在标题中显示一个数据......然后我可以直接在头部调用model_function
  • 没有人阻止你这样做,但它是一个 mvc..如果你有很多控制器意味着你也有很多视图..它有点乱
  • @Saswat 不,你没有!在“oop”中,您可以扩展控制器,因此您可以创建一个默认控制器,将其称为“SiteController”,现在您使用“SiteController”扩展 My_Controller 现在您只需在 SiteController 中声明一次函数,并且您可以在每个控制器中使用此函数你声明像...Hello extends SiteController...请看这个教程philsturgeon.uk/blog/2010/02/…,玩得开心。
【解决方案2】:

一句话:


为什么?

1) 由于codeigniter是一个MVC Framework,我们应该遵循MVC的一些defined protocols
2) 我们必须了解 MVC 框架是如何工作的,因此我们必须使用它。
3) 那么 CI 是如何工作的呢?
- 首先,我们有一个加载特定页面的 URL
- routes 检查与 URL 匹配的路由并调用特定的控制器。
- 如果在路由中找不到匹配项,则检查匹配的 ControllerFunction
- 控制器使用插件数据调用 model,模型将这些数据用于 database operations
- 然后模型将所需的数据返回给控制器,然后控制器使用该数据加载 view


CI 流程:

请求 ---> 路由 ---> 控制器 ---> 模型/库/助手/插件 - --> 控制器 ---> 视图


你的答案:

1) 在视图中调用模型无论如何都会起作用(如果模型是自动加载的),但它仍然是 wrong。这样做意味着我们是 breaking MVC rules
2) 您还可以在上面的流程中看到模型和视图之间存在 no connection
3) 那么我们在哪里可以调用模型:控制器、库、帮助器。

【讨论】:

    【解决方案3】:

    所以另一种看待这个的方式 - 您正在调用视图来呈现产品表 - 但您尚未确认是否有产品。

    控制器调用产品模型并请求产品。如果产品返回,则控制器分配一个适当的视图来显示产品并将 products_list 对象(或数组)传递给视图。视图中的表格中间不应有任何代码

    if(count($product_list)>0)
    

    视图应该有的唯一php代码是

    foreach($product_list as $pl)
    

    展示产品。 $product_list 的值来自模型。因此,例如,如果您的数据库表名发生更改——该更改是在模型中完成的——而不是视图。

    如果没有产品从模型返回 - 那么没有 $product_list。控制器分配一个视图,用户可以在其中搜索/浏览其他产品。我们不需要视图中的 if(count),因为我们已经知道搜索结果是什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2011-02-28
      • 2015-05-12
      • 2013-10-31
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      相关资源
      最近更新 更多