在Cakephp中,我可以在模型中使用afterSave()根据刚刚保存的内容执行其他任务吗?

在Cakephp中,我可以在模型中使用afterSave()根据刚刚保存的内容执行其他任务吗?,cakephp,Cakephp,我有两个模型:绘图有许多面板,面板属于绘图。每次保存面板时,我都要检查它是否是要添加到图形中的第三个面板。如果是,我想将三个面板合并成一个新的png文件,并将png的文件名和路径保存到绘图表中 class Drawing extends AppModel { public $name = 'Drawing'; public $hasMany = array( 'Panel' => array( 'className' => 'Panel',

我有两个模型:绘图有许多面板,面板属于绘图。每次保存面板时,我都要检查它是否是要添加到图形中的第三个面板。如果是,我想将三个面板合并成一个新的png文件,并将png的文件名和路径保存到绘图表中

class Drawing extends AppModel {
  public $name = 'Drawing';
  public $hasMany = array(
    'Panel' => array(
        'className' => 'Panel',
        'dependent' => true,
        'fields' => array('id', 'filepath', 'filename', 'placement')
        )
  );
}

class Panel extends AppModel {
  public $name = 'Panel';
  public $belongsTo = array(
    'Drawing'=>array(
        'className'=>'Drawing',
        'foreignKey'=>'drawing_id',
        'counterCache' => true
        )
    );
}
因为我在面板模型中将counterCache设置为true,所以我在图形表中使用Panel_count跟踪面板,并且我可以检查是否有3个面板。我认为最好的方法是使用afterSave回调。这样,我可以检查现在是否有三个面板,如果有,我可以更新任何我想要的。我的控制器防止用户在有三个面板时添加新面板。然而,我认为下面的代码不起作用——它会阻止我的应用程序的其他部分正常运行,如果我删除afterSave功能,一切都会恢复正常。如何从图形模型中检查面板计数?有更好的方法吗

// Inside of the Drawing model... 
public function afterSave($created){
  if ($this->data[panel_count] == 3){
    // create a new image by merging the three panel images together
    // add the filename and path of the new image to the database
  }
}

创建一个新的model方法来执行该功能,并使用该方法从控制器中保存。原因是Drawing.panel_count属性发生了更改,您必须更新图形记录,这将创建一个afterSave循环


我通常避免回调任何数据损坏,尤其是在同一个模型中,因为它们每次都会运行,有时我只是想保存而不需要额外的损坏。将一段代码从一个方法移动到一个afterSave回调也比从另一个方法移动到afterSave回调要容易得多。

创建一个新的model方法来实现该功能,并使用该方法从控制器中保存。原因是Drawing.panel_count属性发生了更改,您必须更新图形记录,这将创建一个afterSave循环


我通常避免回调任何数据损坏,尤其是在同一个模型中,因为它们每次都会运行,有时我只是想保存而不需要额外的损坏。将一段代码从方法移动到afterSave回调也比从另一个方法移动到afterSave回调要容易得多。

您查看过错误日志吗?这不是一项昂贵的检查,因此在afterSave中运行它对我来说是合理的。我将添加一行:parent::afterSave$created;因此继承链上的余波仍将运行。这可能会破坏你的应用程序。此外,在afterSaves中创建无限循环也很容易——您的错误可能是PHP达到了递归限制。您看过错误日志了吗?这不是一个昂贵的检查,所以在afterSave中运行它对我来说是合理的。我将添加一行:parent::afterSave$created;因此继承链上的余波仍将运行。这可能会破坏你的应用程序。此外,在afterSaves中创建无限循环也很容易——您的错误可能是PHP达到其递归限制。