我应该使用App :: import('Model',...)还是ClassRegistry(...)?

时间:2011-03-08 20:28:03

标签: php cakephp frameworks cakephp-1.3

由于其他答案(like this),我只是想澄清 CakePHP 1.3 中应该使用的内容。

具体来说,我有一种情况需要一个模型依赖于另一个,所以从该模型中的方法我想加载另一个,用信息做一些事情等。

documentation for the App Class说:

  

在以前的版本中,根据您要加载的类的类型,有不同的函数来加载所需的类。这些函数已被弃用,所有类和库加载都应该通过App :: import()来完成。

我假设这涵盖ClassRegistry等的使用,但我只想明确,并确定:

我应该使用App::import('Model', ...)从另一个模型中使用一个模型吗?如果别的什么,什么?

4 个答案:

答案 0 :(得分:13)

看来,即使是引用文档,即使是自2008年以来的两年,最好的方法是使用ClassRegistry::init()

这在特定类/方法的实际API /文档中很明显。

App::import()

  

根据$ name或要搜索的特定文件查找类。调用App :: import()不会构造文件中包含的任何类。它只会找到并要求()文件。

ClassRegistry::init()

  

加载一个类,在注册表中注册该对象并返回该对象的实例。

     

示例简单使用:获取Post模型实例ClassRegistry :: init('Post');

正如您所看到的,即使API文档也指出了使用ClassRegistry加载模型,为您实例化它们的示例,而不是App::import(更少),尽管已更改CakePHP“Book”文档中的措辞。

答案 1 :(得分:7)

如果您可以关联模型,那么最好的方法是使用

动态绑定关系

$this->bindModel("hasOne" => array("Model2"))

如果您无法关联模型并且只想在一次出现时使用第二个模型,那么您可以使用

ClassRegistry::init('Model2')->find('allThatIWant');

如果您想多次使用它,那么您必须尝试

$this->model2 = & ClassRegistry::init('Model2') 
$this->model2->find('allThatIWant');

答案 2 :(得分:2)

从2.6.x开始,它仍然是ClassRegistry :: init()。

存在重大差异。 App :: import只包含/要求它。另一方面,ClassRegistry::init()将实例化它并获取模型的完全加载对象。

所以说,例如,你在AppController的beforeFilter中加载了一个模型。您可以使用 $ this-> Model-> __ something 为其添加一些自定义属性。现在你可以在没有$ controller对象的地方调用ClassRegistry :: init(' Model'),例如,在一个行为中。 ClassRegistry :: init(' Model')返回的对象将具有您的自定义属性 $ this-> Model-> __ something

顺便说一下, $ controller-> loadModel()似乎是加载模型的理想方式,在这里您可以使用$ controller对象,例如在您的组件中。

答案 3 :(得分:-2)

除非你需要整个控制器,否则

$this->loadModel('model name')会做,然后只需在模型中定义关系,例如hasone,belongssto ......并调用$this->model->model2