在Zend Framework中初始化模型

时间:2011-05-09 11:57:57

标签: zend-framework model

根据this blog post,应该可以在模型中使用init()方法。像这样:

class MyModel
{
    public function init()
    {
        // prepare something
    }   

... 
}

这对我不起作用。有人知道我是否必须在某个地方设置一个参数(例如在配置文件中)或者我的Zend FW版本(1.11.4)中是否还有这种情况?我在init方法中检查了error_log('something')并且根本没有调用它。

更新: 我稍微扩展了Adam的解决方案:

public function __construct() {
    if (get_parent_class($this) != false) {
        parent::__construct();
    }
    if(method_exists($this, 'init')) {
        $this->init();
    }
}

这样它就可以放在基类中然后扩展。以防万一之后有人也需要相同的解决方案。

3 个答案:

答案 0 :(得分:4)

该帖子非常具有误导性。如果应用程序中的模型类扩展Zend_Db_TableZend_Db_Table_Row,这在帖子的示例中并非如此,但是从文本中隐含,那么是的,您可以添加将被调用的init()方法自动。为了在您的应用程序中工作,您需要从创建模型的任何方法或基类的构造函数中调用方法。

答案 1 :(得分:2)

尝试从构造函数中添加对init()的调用,如下所示:

public function __construct()
{
  parent::__construct();
  $this->init();
}

答案 2 :(得分:2)

你有这个问题因为php类没有init方法。该init方法仅适用于Zend类。这意味着您只能在扩展Zend类时使用它。这意味着你实际上覆盖了init方法。

E.g。这里是Zend_Db_Table_Abstract类:

/**
 * Initialize object
 *
 * Called from {@link __construct()} as final step of object instantiation.
 *
 * @return void
 */
public function init()
{
}

因此,如果您更改模型以扩展zend,它将起作用:

class MyModel extends Zend_Db_Table_Abstract
{
    public function init()
    {
        // prepare something
    }   

... 
}

与Zend_Controller_Action相同,这就是为什么你也可以在你的控制器中使用它。