在 Zend Framework 中初始化模型

发布于 2024-11-06 09:54:52 字数 711 浏览 0 评论 0原文

根据 这篇博文 模型中应该有一个 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();
    }
}

这样就可以将其放置在基类中,然后进行扩展。以防万一以后有人也需要相同的解决方案。

According to this blog post it should be possible to have an init() method within the model. Like this:

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

... 
}

This does not work for me. Does anybody know if I have to set somewhere a parameter (e.g. in the config file) or if this is not possible any more in my Zend FW version (1.11.4)? I checked with error_log('something') within the init method and it does not get called at all.

UPDATE:
I have extended Adam's solution a little:

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

This way it can be placed in a base class and then extended. Just in case someone needs the same solution later too.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

短叹 2024-11-13 09:54:52

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

That post is very misleading. If the model classes in the application extend Zend_Db_Table or Zend_Db_Table_Row, which is not the case in the post's examples but is implied from the text, then yes you can add an init() method that will be called automatically. For this to work in your application you would need to be calling the method from whatever creates your models, or from the constructor of a base class.

凤舞天涯 2024-11-13 09:54:52

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

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

Try adding a call to init() from the constructor as so:

public function __construct()
{
  parent::__construct();
  $this->init();
}
清风不识月 2024-11-13 09:54:52

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

例如,它位于 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 相同,这就是为什么您也可以在控制器中使用它。

you have that problem because a php class does not have an init method. That init method is only applicable to Zend classes. Which mean you can only use it when you extend a Zend class. Which means you are actually overriding the init method.

E.g. here it is in the Zend_Db_Table_Abstract class:

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

So if you change your model to extend zend it will work:

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

... 
}

It's the same with Zend_Controller_Action, which is why you can also use it in your controllers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文