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