【问题标题】:cakephp calling controller action from modelcakephp 从模型调用控制器动作
【发布时间】:2013-03-30 01:46:17
【问题描述】:

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

【问题讨论】:

  • 即使有你的解释,我也看不出从模型中调用控制器的意义。

标签: cakephp


【解决方案1】:

“胖”模型是一件好事,但是,尽量不要将不应该在模型中的东西放在模型中。在 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);
}

放置代码的其他位置

与数据无关的代码也可以移到您的控制器之外(使其“瘦”)。 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 中的事件系统;这可能是您正在寻找的:

Dispatching Events - send emails

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多