【问题标题】:CodeIgniter - MVC approach questionCodeIgniter - MVC 方法问题
【发布时间】:2011-07-25 15:26:52
【问题描述】:

我目前正在 CodeIgniter 中制作一个应用程序,我想知道我应该如何处理模型。我目前的设置方式:

查看次数:显示 控制器:显示相关内容、表单验证、重定向、与库对话等 库:做繁重的工作,与模型交谈,生成错误消息,日志等 模型:与数据库交谈

(我目前在大多数事情上都使用 Active Record)

让我直接举个例子:

我有一个 Auth 库,里面有一些类似的查询,只是 WHERE 子句中的值不同。

例如:

get_by_id($id);
get_by_password_hash($email);
get_by_email($email);

我应该拥有一堆这些重复的模型函数,还是应该只拥有一个简单的函数,通过库传递 WHERE 子句等等?

例如:

$where = array('id' => $id);
get($where);

如果您希望我澄清任何事情,请告诉我。 提前致谢。

【问题讨论】:

    标签: php codeigniter activerecord


    【解决方案1】:

    如果给定模型有很多 get_by_* 方法,那么使用 TaylorOtwell 建议的魔法方法确实很有意义。实际上,__call 方法以及__get 和__set 在其他框架中经常使用,以便轻松完成您正在谈论的事情。请记住 CI 在映射时不会与控制器上的 __call Magic 方法配合使用(但这不会影响模型)。

    我在 CI 中查看 CMV 的基本方式:

    • 库——这是大部分“渲染逻辑”发生的地方,但通常应该与控制/模型/视图无关。几乎完全无国籍(我的偏好)。
    • Helpers -- 实用函数,主要与视图相关(其他一切都作为库更好(更正交,yada,yada,yada))
    • 控制器 -- 加载库/模型并调用方法
    • 模型——数据库包装层。几乎完全有状态(我的偏好)。
    • 视图 -- 显示数据

    控制器通常会执行以下操作:

    class Users
    {
        function display( $id )
        {
            $this->load->library( 'myformatlib' );
            $this->load->model( 'mymodel' );
            $data = $this->mymodel->get_user( $id );
            $formatted = $this->myformatlib->addColors( $data );
            $this->mymodel->incrementViews( $id );
            $this->load->view( 'full_user', $formatted );
        }
    }
    

    至于传递 where 子句——数据库查询几乎应该完全归入模型,除非没有其他选择,否则这样做会过于麻烦(但我想知道你是否不能重构它)。

    【讨论】:

      【解决方案2】:

      您可以在模型上使用 PHP 的 __call Magic Method 来处理任何简单的 where 子句:

      public function __call($method, $parameters)
      {
          if (strpos($method, 'get_by_') === 0)
          {
              $this->get(array(substr($method, 7), $parameters[0]));
          }
      }
      

      【讨论】:

        【解决方案3】:

        我很清楚你来自哪里,因为几个月前我也有同样的疑问。

        我用https://bitbucket.org/philsturgeon/codeigniter-base-model/src/93a643d0d46f/MY_Model.php

        只需将其用作库即可。您将模型创建为

        // user_m.php
        <?php (defined('BASEPATH')) OR exit('No direct script access allowed');
        class User_m extends MY_Model
        {}
        

        除了基本的 CRUD 之外,上面可以有任何你想要的自定义函数。

        您在控制器中运行代码

           $this->load->model('user_m');
           $this->data['user'] = $this->user_m->get($user_id);
        

        或

           $this->load->model('user_m');
           $this->data['user'] = $this->user_m->get_by(array('something_id' => $something));
        

        它拥有您需要的所有基本 CRUD 操作。只需阅读代码,它的文档也很好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-10
          • 2012-02-29
          • 1970-01-01
          • 2012-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多