cakephp 你如何在模型中调用控制器的动作

Posted

技术标签:

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

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

我试过这样称呼它:

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

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

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

【问题讨论】:

你不知道!您在其他模型中使用模型方法,永远不要使用控制器!所以让你的代码成为模型方法。那么你就可以轻松使用它了。 【参考方案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 不适用于声明组件。如果我制作一个电子邮件模型,我是否还需要以某种方式访问​​该组件?

以上是关于cakephp 你如何在模型中调用控制器的动作的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP Auth 如何允许特定的控制器和动作

CakePHP 获取动作名称

使用 jquery 调用 cakephp 动作并将数组作为参数传递

如何在 CakePHP 中使用自定义 MySQL 查询?

如何在 CakePHP 控制器中使用多个模型

多模型验证 cakephp 2