多次调用 Cakephp 回调函数
Posted
技术标签:
【中文标题】多次调用 Cakephp 回调函数【英文标题】:Cakephp Callback function called multiple times 【发布时间】:2015-04-13 11:11:56 【问题描述】:首先是一些背景信息:
用户可以填写一些输入文本框并上传多张图片(在一个上传字段中)。提交表单后,文本字段中的文本以$this->XXX->save()
保存在数据库中。此外,数据(特别是来自文件上传的图像)在回调函数afterSave()
中进行处理。到目前为止一切顺利。
现在问题来了:
似乎多次调用回调函数(每上传一张图片1次)。所以问题是,第一次一切正常,但之后$this->data
数组基本上是空的(所有文本字段都是= ''
)所以回调函数会抛出一些异常,因为没有数据。我通过检查isset()
等解决了问题,但我认为这并不能解决问题。
所以我的问题是,为什么回调函数会被多次调用,我该如何防止呢?
编辑: 以下是一些相关的代码sn-ps:
控制器:
if ($this->request->is('post') || $this->request->is('put'))
if($aid==null) $this->Article->create();
if ($this->Article->save($this->data))
$this->Session->setFlash(__('The article has been saved'), 'flash_custom');
return $this->redirect(array('controller' => 'articles', 'action' => 'view', $this->id));
...
型号:
我认为其中大部分与这里无关。一般来说,我将数据发送到其他模型,这些数据保存在其他数据库表中,例如图片
if ($this->data['Article']['picture'])
foreach ($this->data['Article']['picture'] as $picture)
if (is_uploaded_file($picture['tmp_name']) && (substr($picture['type'], 0, 5) == "image") && $numberOfPictures < $pictures_allowed)
$this->Picture->addPicture($picture, $this->id);
$numberOfPictures++;
错误转储:
我认为 $this->data
数组的 Dump 在这里非常有趣(解释如下)
array(
'Article' => array(
'pictures' => '0',
'title' => 'Error Test',
'abstract' => 'Test abstract',
'body' => 'Testtext',
'picture' => array(
(int) 0 => array(
[maximum depth reached]
),
(int) 1 => array(
[maximum depth reached]
),
(int) 2 => array(
[maximum depth reached]
)
),
'modified' => '2015-04-13 22:00:09',
'created' => '2015-04-13 22:00:09',
'id' => '294'
))
Notice (8): Undefined index: title [APP/Model/Article.php, line 723]
Notice (8): Undefined index: body [APP/Model/Article.php, line 724]
Notice (8): Undefined index: abstract [APP/Model/Article.php, line 725]
array(
'Article' => array(
'id' => '294',
'pictures' => (int) 1,
'modified' => '2015-04-13 22:00:09',
'title' => '',
'body' => '',
'abstract' => '',
)
)
Notice (8): Undefined index: picture [APP/Model/Article.php, line 777]
Notice (8): Undefined index: title [APP/Model/Article.php, line 723]
Notice (8): Undefined index: body [APP/Model/Article.php, line 724]
Notice (8): Undefined index: abstract [APP/Model/Article.php, line 725]
array(
'Article' => array(
'id' => '294',
'pictures' => (int) 2,
'modified' => '2015-04-13 22:00:10',
'title' => '',
'body' => '',
'abstract' => '',
)
)
Notice (8): Undefined index: picture [APP/Model/Article.php, line 777]
Notice (8): Undefined index: title [APP/Model/Article.php, line 723]
Notice (8): Undefined index: body [APP/Model/Article.php, line 724]
Notice (8): Undefined index: abstract [APP/Model/Article.php, line 725]
array(
'Article' => array(
'id' => '294',
'pictures' => (int) 3,
'modified' => '2015-04-13 22:00:10',
'title' => '',
'body' => '',
'abstract' => '',
)
)
Notice (8): Undefined index: picture [APP/Model/Article.php, line 777]
解释:
我刚刚转储了一次$this->data
,但就像你看到的那样,我上传了 3 张图片,我收到了 3 个 afterSave 电话,因此 3 个$this->data
转储。第一次一切正常,但之后由于数组不再填充而引发了一些警告。
我希望这些额外的信息可以帮助你
【问题讨论】:
显示您的功能代码。解释不会帮助你。请说明您认为错误发生在哪里。 【参考方案1】:如果您通过相同模型的 aftersave 回调调用 Model::save,那么它将是递归保存,因为 aftersave 将调用保存,这将再次触发 aftersave..
在 aftersave 中使用的保存方法中禁用回调
$this->save($data, array('callbacks' => false));
Documentation
【讨论】:
好方法,但我不通过 afterSave 回调调用 Model::save .. 不过还是谢谢你! 那么你如何保存回调中的数据呢?贴一些代码 好的,我一步一步地浏览了代码,实际上你的建议是非常正确的!我在一个完全不同的模型的回调函数中找到了一个 save() 但在发布的文章模型中启动了..所以谢谢以上是关于多次调用 Cakephp 回调函数的主要内容,如果未能解决你的问题,请参考以下文章