Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 你能从CodeIgniter中的另一个模型内部访问一个模型吗?_Php_Codeigniter_Authentication_Model - Fatal编程技术网

Php 你能从CodeIgniter中的另一个模型内部访问一个模型吗?

Php 你能从CodeIgniter中的另一个模型内部访问一个模型吗?,php,codeigniter,authentication,model,Php,Codeigniter,Authentication,Model,我正在使用需要身份验证的CodeIgniter编写一个Web应用程序。我创建了一个处理所有身份验证的模型。但是,我找不到从另一个模型内部访问此身份验证模型的方法。有没有一种方法可以从另一种模式内部访问模型,或者有更好的方法可以在CodeIgniter内部处理身份验证?通常,您不希望在对象内部创建对象。这是一个坏习惯,相反,编写一个清晰的API并将模型注入到您的模型中 <?php // in your controller $model1 = new Model1(); $model2 =

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

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

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

不要在您的模型中处理身份验证。仅使用模型与您的数据库、ldap或其他接口


我创建了一个用于管理身份验证和授权的身份验证库。您可以从控制器访问这样的库。

似乎您可以在模型中加载模型,尽管您可能应该用另一种方法来解决这个问题。请参阅以进行讨论

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();
  }
}

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

现在可以使用新的CodeIgniter在模型中加载模型。

是的,与在Model1中初始化Model2相比,更好的做法是“注入”依赖关系。什么不是好的做法?注入依赖项是一种很好的做法@直到它可能已经三年了,但人们仍然能找到它(我找到了)。所以它仍然可以讨论;)我主要反对你的第一句话“一般来说,你不想在对象内部创建对象。”这是错误的。时期大多数OO设计模式都需要在对象内部创建对象。你不能把它们都注射进去。尝试使用工厂模式注入所有创建的内容。它超越了模式的全部要点。现在,在CI模型中创建CI模型是否是一个好的实践更值得商榷…@DanielBingham为了代码的可测试性,我反对在对象中引入不易交换的依赖项。这就是我要说的——这就是为什么我仍然坚持我的原始观点,即你应该瞄准DI。我不想再进一步争论这个问题,因为每隔几个月就会有人想表达自己的观点。有一种叫做依赖注入(DI)的东西,它允许您和我交换对象的依赖关系——如果有什么区别的话,这对“可维护代码”(代码质量)和用于测试的LBNL都是一种优势。认为不需要单独测试对象是可以的,但这样就不再进行单元测试了。虽然您的目标是测试业务逻辑,但最终测试的是整个框架和底层数据库。这并不能让在代码中发现bug变得更容易。抱怨是这样做不必要地在两个模型之间产生了更强的依赖性。例如,当您进行测试时,能够为SomeModel提供SomeOtherModel的模拟版本是很好的;如果前者直接加载后者,则不能这样做。或者稍后修改代码以使用具有相同接口的不同模型,例如当您重构现有代码以使用插件系统时。Google有一个开源依赖注入框架。它是针对Java的,但它解释了依赖注入的优点和一些缺点@罗伯·霍华德:有一种说法是,依赖性注射太过分了。没有必要注入您使用的每个对象,因为并非您使用的每个对象都需要单独测试。相反,你想测试作为一个整体一起工作的系统和模块,这些系统和模块需要相互隔离并注入。我不敢相信这个答案获得了15票赞成票,其背后的推理让我感到畏缩,这是反模式的反模式(不,它不能通过双重否定来实现)我总是把我的oauth实现放在一个模型中,我不喜欢用身份验证代码弄乱我的控制器我创建了一个my_控制器并在那里执行所有的oauth。