0

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

4

2 回答 2

2

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

胖模特

“胖”模型的概念是通过将与数据相关的代码移动到模型中来减少控制器中的代码量。例如:

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

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);
}

放置代码的其他位置

与 data 无关的代码也可以移到您的 Controller 之外(使其“瘦”)。CakePHP 提供了将代码移动到的其他位置,例如在组件内部

然后在你的控制器里面;

这:

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

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

通过事件触发功能

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

为某些事件发送电子邮件就是一个很好的例子。CakePHP 还使用发送邮件来说明 CakePHP 中的事件系统;这可能是您正在寻找的:

调度事件 - 发送电子邮件

于 2013-03-29T17:46:17.483 回答
1

让您的模型方法返回数据,以便您将其保存在控制器中,并将其与您的 pdf 相关数据一起传递给其他模型函数。

于 2013-03-29T16:14:53.623 回答