调试 save() 返回 false CakePHP 3.0
Debugging save() returning false CakePHP 3.0
我有一些代码在开发过程中的某个地方出现问题,我在调试它时遇到了问题。
这是它的简化版本。
$data = $this->request->data;
$form = $this->Forms->get($data['id'], [
'contain' => ['FieldsForms' => ['data']
]
]);
$form = $this->Forms->patchEntity($form, $data,
['associated' => [
'FieldsForms.Data',
]
]);
if ($this->Forms->save($form)) {
// sunshine and rainbows
} else {
// wailing and gnashing of teeth
}
我已经哭得咬牙切齿了,没有任何错误,据我所知,如果我调试 $data 它看起来没问题(尽管因为它相当长并且包含一堆 UUID,所以我可能'我遗漏了一些东西)。
验证错误为空。
保存返回错误 - 关于如何调试它的任何建议可能会挽救我剩下的理智。
谢谢!
原来是数据的问题,如预期的那样,但由于保存返回false并且数据很大而无法立即看到。
我首先制作了显示相同行为的问题数据的子集,然后按照 ndm 的建议,更改了保存功能的 ORM/Table.php 代码,如下所示,以便能够看到问题出在哪里:
// $entity->errors() is deprecated as of CakePHP 3.7
// $entity->getErrors() should be used in later versions
$x = $entity->errors();
if ($x) {
debug($entity);
debug($x);
return false;
}
这样我就可以看到发生了什么并继续修复数据。
不确定较早的答案是否基于旧版本,但在最新的 cakephp 版本 (3.4) 中,您可以直接从控制器中的 $entity 检索错误。 errors 数组包含每个失败的实体字段,以及一个失败验证的子数组。
<?php
// In Articles Controller
...
public function add(){
...
if ($this->Articles->save($article)) {
$this->Flash->success(__('The Article has been saved.'));
return $this->redirect(['action' => 'index']);
} else {
Log::Debug($article->errors());
}
您可以改为修改核心 Cake 代码:
if ($this->Forms->save($form)) {
// sunshine and rainbows
} else {
//you know now what fail
$andTheErrorsAre = $entity->getErrors();
}
对于 CakePHP 3.4。*
试试这个代码:
if (!$this->Forms->save($form)) {
$this->log($form->getErrors(),'error');
}
在此处阅读有关日志的更多信息:https://book.cakephp.org/3.0/en/core-libraries/logging.html#using-the-filelog-adapter
我有一些代码在开发过程中的某个地方出现问题,我在调试它时遇到了问题。
这是它的简化版本。
$data = $this->request->data;
$form = $this->Forms->get($data['id'], [
'contain' => ['FieldsForms' => ['data']
]
]);
$form = $this->Forms->patchEntity($form, $data,
['associated' => [
'FieldsForms.Data',
]
]);
if ($this->Forms->save($form)) {
// sunshine and rainbows
} else {
// wailing and gnashing of teeth
}
我已经哭得咬牙切齿了,没有任何错误,据我所知,如果我调试 $data 它看起来没问题(尽管因为它相当长并且包含一堆 UUID,所以我可能'我遗漏了一些东西)。
验证错误为空。
保存返回错误 - 关于如何调试它的任何建议可能会挽救我剩下的理智。
谢谢!
原来是数据的问题,如预期的那样,但由于保存返回false并且数据很大而无法立即看到。
我首先制作了显示相同行为的问题数据的子集,然后按照 ndm 的建议,更改了保存功能的 ORM/Table.php 代码,如下所示,以便能够看到问题出在哪里:
// $entity->errors() is deprecated as of CakePHP 3.7
// $entity->getErrors() should be used in later versions
$x = $entity->errors();
if ($x) {
debug($entity);
debug($x);
return false;
}
这样我就可以看到发生了什么并继续修复数据。
不确定较早的答案是否基于旧版本,但在最新的 cakephp 版本 (3.4) 中,您可以直接从控制器中的 $entity 检索错误。 errors 数组包含每个失败的实体字段,以及一个失败验证的子数组。
<?php
// In Articles Controller
...
public function add(){
...
if ($this->Articles->save($article)) {
$this->Flash->success(__('The Article has been saved.'));
return $this->redirect(['action' => 'index']);
} else {
Log::Debug($article->errors());
}
您可以改为修改核心 Cake 代码:
if ($this->Forms->save($form)) {
// sunshine and rainbows
} else {
//you know now what fail
$andTheErrorsAre = $entity->getErrors();
}
对于 CakePHP 3.4。*
试试这个代码:
if (!$this->Forms->save($form)) {
$this->log($form->getErrors(),'error');
}
在此处阅读有关日志的更多信息:https://book.cakephp.org/3.0/en/core-libraries/logging.html#using-the-filelog-adapter