CodeIgniter - MVC方法问题


CodeIgniter - MVC approach question

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

视图:显示控制器:显示相关的东西,表单验证,重定向,与库对话等库:完成繁重的工作,与模型对话,生成错误消息、日志等模型:与DB对话

(我目前使用活动记录的大多数事情)

让我直接看一个例子:

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

,

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

我应该有一堆这些重复的模型函数,或者我应该只有一个简单的函数,我通过库传递where子句和什么?

,

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

如果你需要我澄清什么,请告诉我。

如果给定的模型有很多get_by_*方法,那么使用TaylorOtwell建议的魔法方法确实是有意义的。实际上,__call方法,以及__get__set在其他框架中经常使用,使它很容易做到你所说的。只要记住CI在映射时不会很好地处理控制器上的__call Magic方法(但这不会影响模型)。

我对CI中巨细胞病毒的基本看法:

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

通常,控制器会做如下事情:

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子句——DB查询应该几乎完全降级到模型中,除非没有其他选择,否则这样做会非常麻烦(但我想知道您是否可以重构它)。

你可以在你的模型上使用PHP的__call魔术方法来处理任何简单的where子句:

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

我很清楚你的想法,因为几个月前我也有过同样的疑虑。

我使用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操作。只要阅读代码,它的文档也很好。