cakephp从模型调用控制器动作

时间:2013-03-29 14:32:38

标签: cakephp

我有一个购物车网站,并且在成功购买时,我需要将订单中所有产品详细信息的邮件作为附件发送。我使用了胖模型瘦控制器方法,我的所有功能都在模型中。我有一个控制器动作,它将通过传递订单ID和视图来提供订单详细信息。使用dompdf我可以将此html转换为pdf并可以创建文件。因此,为了创建附件,我可以通过传递一些参数来使用相同的功能。我的邮件发送代码在模型中。从这里我需要调用控制器操作,并需要获取刚刚创建的pdf文件名。我知道从模型调用控制器动作是针对MVC架构的。但是我怎样才能实现这个功能呢?

2 个答案:

答案 0 :(得分:2)

'fat'模型是一件好事,但是,尽量不要把东西放在Model 中,而不应该在Model 中。在MVC中,模型应处理与数据相关的所有内容。

脂肪模型

'胖'模型概念是通过将数据相关代码移动到模型来减少Controller中的代码量。例如:

取而代之; (在您的控制器中):

public function view($id)
{
    $this->request->data = $this->SomeModel->find('first', array(
        'fields' => array(
            // list of fields to retrieve
        ),
        'conditions' => array(
            // conditions
        ),
        // etc.
    ); 
}

将查找指令移动到模型内的方法并使用:

public function view($id)
{
    $this->request->data = $this->SomeModel->someMethod($id);
}

放置代码的其他位置

与数据无关的代码,也可以移到您的控制器之外(使其“瘦”)。 CakePHP提供其他位置来移动代码,例如在Component

然后在你的控制器内;

这样:

public function view($id)
{
    $this->request->data = $this->SomeModel->someMethod($id);

    // use functionality of a component
    $this->SomeComponent->doSomething();
}

通过事件触发功能

为了将代码和逻辑保留在控制器之外,CakePHP 2.x现在提供了一个“事件”系统。这允许您在发生特定事件时执行代码。您可以通过事件传递其他信息(事件将成为通过您的应用程序的“通信渠道”)。

发送特定事件的电子邮件就是一个很好的例子。 CakePHP还使用发送邮件来说明CakePHP中的Event系统;这可能就是你要找的东西:

Dispatching Events - send emails

答案 1 :(得分:1)

让你的模型方法返回数据,这样你就可以在控制器中将它与你的pdf相关数据一起传递给另一个模型函数。