Cakephp 避免多次回调


cakephp avoid multiple callbacks

假设我有一个hasMany Items User模型(当然,还有Item belongsTo User

每次在我的应用程序中的任何地方修改Item我希望向他的用户(或其用户)发送电子邮件

所以在我的项目模型中,我写了类似的东西

public function beforeSave($options = array())
{
    // if data is modified find User and send him email
}

但是当我在我的操作中同时编辑多个项目时(即在 foreach 循环中),然后发送几封电子邮件,但我只想要一封电子邮件,或者为参与更新的每个用户发送一封电子邮件。

我怎样才能做到这一点?

也许使用蛋糕事件系统?

您可以设置一个额外的变量:

public $isMultiple = false;
public function beforeSave($options = array())
{
    if(!$this->isMultiple) {
        $this->isMultiple = true;
        // if data is modified find User and send him email
    }
}

首先,不要从数据模型内部发送电子邮件。电子邮件活动非常不稳定,您应该保持数据模型代码尽可能稳定。相反,当您需要发送电子邮件时,请使用组件并在组件上调用方法。

听起来您想报告已完成的交易,而不是单个记录编辑。处理此问题的一种方法是在用户模型中设置上次发送电子邮件时间的日期时间戳。然后,您可以使用该日期时间戳查找已修改的物料记录,并通知这些更改。

在控制器中,您只需根据需要修改项目即可。

public function action()
{
    foreach($record in $records)
    {
        ......
        $this->Item->save(....);
    }
    $this->MyEmailComponent->notify($user_id);
}

然后在电子邮件组件中,您将查询自上次发送电子邮件以来哪些项目发生了更改的项目模型。

public function notify($user_id)
{
    $this->User->id = $user_id;
    $last_email = $this->User->field('emailed');
    $updated_items = $this->Item->find('all',array(
        'conditions'=>array('Item.updated >'=>$last_email)
    ));
    // send email about those items
    $this->User->saveField('emailed',date('Y-m-d h:i:s'));
}