您可以从CodeIgniter中的另一个模型中访问模型吗?

Eld*_*ila 18 php authentication model codeigniter

我正在使用需要身份验证的CodeIgniter编写webapp.我创建了一个处理所有身份验证的模型.但是,我找不到从另一个模型中访问此身份验证模型的方法.有没有办法从另一种模式内部访问模型,或者在CodeIgniter中处理身份验证的更好方法?

Chr*_*vén 18

看起来你可以在模型中加载模型,尽管你可能应该以另一种方式解决这个问题.有关讨论,请参阅CodeIgniter论坛.

class SomeModel extends Model
{
  function doSomething($foo)
  {
    $CI =& get_instance();
    $CI->load->model('SomeOtherModel','NiceName',true);

    // use $CI instead of $this to query the other models
    $CI->NiceName->doSomethingElse();
  }
}
Run Code Online (Sandbox Code Playgroud)

另外,我不明白Till所说的不应该在对象内部创建对象.你当然应该!将对象作为参数发送对我来说不太清楚.

  • 抱怨是这样做不必要地在两个模型之间产生了更强的依赖性.例如,当您进行测试时,能够为SomeModel提供SomeOtherModel的模拟版本是一件好事.如果前者直接加载后者,你不能这样做.或者您稍后修改代码以使用具有相同界面的不同模型,例如当您重构现有代码以使用插件系统时. (3认同)

Til*_*ill 14

通常,您不希望在对象内创建对象.这是一个坏习惯,而是编写一个清晰的API并将模型注入模型中.

<?php
// in your controller
$model1 = new Model1();
$model2 = new Model2();
$model2->setWhatever($model1);
?>
Run Code Online (Sandbox Code Playgroud)

  • 什么不是好的做法?注入依赖关系**是很好的做法! (5认同)
  • 我不想进一步争论这个问题,因为每隔几个月就会有人表达自己的观点.有一种称为依赖注入(DI)的东西,它允许你和我交换对象的依赖关系 - 如果有的话,这对于"可维护代码"(代码质量)和LBNL进行测试是有利的.认为你不需要单独测试对象很好,但是你不再需要进行单元测试了.当您的目标是测试业务逻辑时,您最终会在下面测试整个框架和数据库.这样不会更容易在代码中找到错误. (3认同)
  • 是的,更好的做法是"注入"依赖关系,而不是在Model1中初始化Model2. (2认同)