【问题标题】:cakephp how do you call a controller's action inside a modelcakephp 你如何在模型中调用控制器的动作
【发布时间】:2013-01-15 17:11:00
【问题描述】:

我正在消息模型中的 afterSave 中工作。我想在每次创建消息时发送一封电子邮件以通知收件人他们的新消息。我在消息控制器中有一个发送电子邮件的操作,我想从 afterSave 中调用它。

我试过这样称呼它:

function afterSave($created){
    if($created){
        $this->msgToEmail($this->data);
    }
}

我收到一个 sql 错误,因为它在模型内部而不是控制器中查找函数。

如何声明模型函数?有可能吗?

【问题讨论】:

  • 你不知道!您在其他模型中使用模型方法,永远不要使用控制器!所以让你的代码成为模型方法。那么你就可以轻松使用它了。

标签: cakephp model controller after-save


【解决方案1】:

您在其他模型中使用模型方法,永远不要使用控制器!

所以让你的代码成为一个模型方法。那么你就可以轻松使用它了。

在 1.3 中,您现在可以在模型方法中破解组件。直到你最终可以升级到 2.x。

App::import('Component', 'Email');
$this->Controller = new Controller();
$this->Email = new EmailComponent(null);
$this->Email->initialize($this->Controller);
// from/to/subject/...
$this->Controller->set('text', $this->data['Model']['content']);
return $this->Email->send();

【讨论】:

  • 但是我如何处理从模型渲染视图?当我使用 $this->set() 时,我的变量不会进入模板文件。
【解决方案2】:

要声明模型方法,只需将其放入模型中(而不是控制器)。

在您的模型文件中:

public function msgToEmail($data) {
    // code to send your email...
}

另外,不要忘记在模型文件的顶部导入CakeEmail

App::uses('CakeEmail', 'Network/Email');

【讨论】:

  • 正确!在您的模型中发送电子邮件。还要从控制器中删除发送电子邮件代码,这是对 MVC 的反模式。我喜欢创建一个特定于发送电子邮件的模型,我只是将它“导入”到我需要的模型中。
  • 我使用的是 1.3 版,其中电子邮件只是一个组件。 App:uses 不适用于声明组件。如果我制作一个电子邮件模型,我是否还需要以某种方式访问​​该组件?
猜你喜欢
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 2011-04-01
相关资源
最近更新 更多