CodeIgniter - MVC方法问题

时间:2011-07-25 15:26:52

标签: php codeigniter activerecord

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

观看次数:显示 控制器:显示相关内容,表单验证,重定向,与图书馆交谈等 库:执行繁重的工作,与模型交谈,生成错误消息,日志等 型号:与DB交谈

(我目前正在使用Active Record进行大多数事情)

让我直接举个例子:

我有一个Auth库,在内部我查询的区域有点相似,只能通过WHERE子句中的值来改变。

例如:

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

我是否应该拥有一堆这些重复的模型函数,或者我应该只有一个简单的函数,我通过库传递WHERE子句和诸如此类的东西?

例如:

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

如果您希望我澄清一切,请告诉我。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我知道你来自哪里,因为几个月前我有同样的怀疑。

我使用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操作。只需阅读代码,它也可以很好地记录下来。

答案 2 :(得分:1)

如果你有一个给定模型的很多get_by_*方法,那么使用magicOtwell建议的魔术方法是有意义的。实际上,__call方法以及__get__set经常在其他框架中使用,以便您可以轻松完成您所说的内容。记住CI在映射时控制器上的__call Magic方法不会很好(但这不会影响模型)。

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

  • 库 - 这是大部分“渲染逻辑”发生的地方,但通常应该是控制/模型/视图不可知的。几乎完全无国籍(我的偏好)。
  • 助手 - 实用功能,主要是与视图相关的(其他一切都更好地作为一个库(更正交,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查询应该几乎完全降级到模型,否则这样做会过于繁琐(但我想知道你是否无法重构)。 / p>