【问题标题】:PHP & Codeigniter - how to pass parameters to a model?PHP & Codeigniter - 如何将参数传递给模型?
【发布时间】:2009-07-19 02:29:54
【问题描述】:

我正在使用以下代码从我的控制器中初始化模型:

$this->load->model('model_name');

是否可以以某种方式修改上述行,以便模型构造函数接收参数?我想在模型构造函数中使用如下代码:

function __construct($param_var) {
   parent::Model();

   $this->$param_var = $param_var; //I'm not even sure this works in PHP..but different issue
}

这对我可以重用我的模型类很有帮助。谢谢。

更新: (从一个答案中,我原来的问题已经解决了......谢谢!) 只是为了解释我为什么要这样做:这个想法是能够重用模型类。所以基本上举一个简单的例子,我希望能够将“order_by”变量传递给模型类,这样我就可以重用模型类中的逻辑(并动态更改 sql 中的 order-by 值)而无需创建单独的类或单独的函数。

这是糟糕的设计吗?如果是这样,您能否解释一下为什么您不会做这样的事情以及您将如何做?

【问题讨论】:

  • 我很好奇您为什么要将参数传递给模型的构造函数。我的猜测是你需要一个库而不是一个模型。
  • 我刚刚更新了我的问题,解释了我为什么要这样做

标签: php codeigniter


【解决方案1】:

模型

<?php

/* Load Model core model */
/* BASEPATH = D:\xampp\htdocs\ci_name_project\system\ */
include BASEPATH . 'core\\Model.php';

class User_model extends CI_Model {

    /* Properties */
    private $name;


    /* Constructor parameter overload */
    public function __construct($name) {
        $this->set_name($name);
    }    


    /* Set */
    public function set_name($name) {
        $this->name = $name;
    }


    /* Get */
    public function get_name() {
        return $this->name;
    }

}

控制器

<?php

class User_controller extends CI_Controller {

    public function index() {

        /* Load User_model model */
        /* APPPATH = D:\xampp\htdocs\ci_name_project\application\ */
        include APPPATH . 'models\\User_model.php';

        $name = 'love';

        /* Create $object_user object of User_model class */
        $object_user = new User_model($name);     

        echo $object_user->get_name(); // love

    }

}

【讨论】:

    【解决方案2】:

    您不能通过load 函数传递参数。您必须执行以下操作:

    $this->load->model('model_name');
    $this->model_name->my_constructor('stuff');
    

    在模型中:

    function my_constructor($param_var) {
    ...
    }
    

    对更新的回应:

    您可以在调用模型函数时传递 order_by 值。我假设在您的控制器操作中,您有类似 $this-&gt;model_name-&gt;get($my_id); 的内容,只需将您的 order_by 参数添加到此函数即可。 IMO 这使您的模型逻辑更加灵活/可重用,因为按照您的操作方式,我假设在构造函数中设置 order_by 将为每个函数设置 order_by 值。

    【讨论】:

    • 谢谢,别忘了你也可以在模型函数中设置默认值 $param_var=true。
    • 很好的答案!然而,CodeIgniter 以某种方式阻碍了这种范式。
    【解决方案3】:

    我明白您对此的推理,但我建议您查看Object-Relational Mapping 以满足您的数据库需求。 CodeIgniter 有一个用户制作的 ORM 库,名为DataMapper,我最近一直在使用。您可以将控制器中的表用作对象,它可能更适合您的问题。

    【讨论】:

    • 感谢您的参考,但我认为这可能有点矫枉过正..我知道我没有对我的应用程序进行太多描述,但是您什么时候推荐使用这个 ORM 库?应用程序是否必须非常数据密集(就数据库访问而言)来保证这一点?
    • 在某种程度上是的,我喜欢使用它,因为如果您的应用程序数据密集,它确实会减少代码,但除非您的数据库非常小,否则可能有点矫枉过正。
    【解决方案4】:

    我建议不要使用DataMapper,而是使用IgnitedRecord,因为DataMapper 不再维护,它已被替换为Ruby

    【讨论】:

      【解决方案5】:

      我使用的是 CI 版本 3.X,所以我要说的是它适用于 Codeigniter 3.X(我还没有检查版本 4+)。

      当我查看 system/libraries/Loader.php 文件中的 function model() 的源代码时,注意到它不支持使用构造参数。因此,如果您想实现这一点,您必须更改源代码(粗体,我知道,我刚刚这样做了)。

      下面是我的做法。

      1.首先,替换第355行

      $CI->$name = new $model();

      有一些修改:

      $_args_count = func_num_args();
      if(3 < $_args_count){
          $refl = new ReflectionClass($model);
          $CI->$name = $refl->newInstanceArgs(array_slice($_args_count, 3));
      }else{
          $CI->$name = new $model(); // origin source code 
      }
      

      2.加载稍有差异的模型:

      $this->load->model("model_name", "model_name", false, $param_var); // where amazing happens
      

      现在您可以随心所欲地拥有 $this->model_name

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2012-03-26
        • 1970-01-01
        相关资源
        最近更新 更多