FormHelper::getSourceValue() 在 CakePHP4 中的验证错误时不返回实体
Posted
技术标签:
【中文标题】FormHelper::getSourceValue() 在 CakePHP4 中的验证错误时不返回实体【英文标题】:FormHelper::getSourceValue() doesn't return entity on validation errors in CakePHP4 【发布时间】:2022-01-11 11:51:58 【问题描述】:我有一个实体 article
,其中包含实体 photos
和 hasMany
关联。
在编辑文章时,我使用$this->Form->getSourceValue('photos')
来获取并显示输入文件下方字段photos
的关联照片。
// $this->Form->getSourceValue('photos') when I arrive on edit page of an article
[
(int) 0 => object(FileManager\Model\Entity\Fichier) id:0
'id' => (int) 36
'model' => 'Articles'
'foreign_key' => (int) 190
'field' => 'photos'
'dir' => '/files/Articles/photos'
'filename' => 'Photo1.png'
'type' => 'image/png'
'size' => (int) 1393814
'caption' => ''
'rang' => (int) 4294967295
'[new]' => false
'[accessible]' => [
'*' => false,
'caption' => true,
]
'[dirty]' => [
]
'[original]' => [
]
'[virtual]' => [
]
'[hasErrors]' => false
'[errors]' => [
]
'[invalid]' => [
]
'[repository]' => 'FileManager.Photos'
,
(int) 1 => object(FileManager\Model\Entity\Fichier) id:1
'id' => (int) 37
'model' => 'Articles'
'foreign_key' => (int) 190
'field' => 'photos'
'dir' => '/files/Articles/photos'
'filename' => 'Photo2.png'
'type' => 'image/png'
'size' => (int) 1400345
'caption' => ''
'rang' => (int) 4294967295
'[new]' => false
'[accessible]' => [
'*' => false,
'caption' => true,
]
'[dirty]' => [
]
'[original]' => [
]
'[virtual]' => [
]
'[hasErrors]' => false
'[errors]' => [
]
'[invalid]' => [
]
'[repository]' => 'FileManager.Photos'
,
]
我的目标是允许为相关照片编写标题,因此我在每张照片下方显示输入 caption
:
// Inputs for Associated Photos underneath each photo
$this->Form->control("$field.$i.id");
$this->Form->control("$field.$i.caption");
但是当我在文章的表单中出现验证错误时,getSourceValue('photos')
不再包含实体photos
,而是包含id
和caption
的数组。
// $this->Form->getSourceValue('photos') after validation error
[
[
'id' => 36,
'caption' => ''
],
[
'id' => 37,
'caption' => ''
]
]
我不能再显示照片了。
验证失败后如何获取实体photo
?
【问题讨论】:
【参考方案1】:默认情况下,表单助手将使用请求数据中的值(如果存在),以便在您的表单中填充用户提交后输入的数据,否则用户输入的数据可能会丢失,例如验证错误,在这种情况下,实体上没有设置无效数据。
如果您想使用与您提交的内容无关的数据,那么您通常最好直接从您用于表单的实体中获取数据,或者根据情况从单独查询的实体,表单助手和控制器中的修补机制都不会触及。
长话短说,使用$article->photos
而不是$this->Form->getSourceValue('photos')
。
【讨论】:
好的,但就我而言,我看不出这怎么可能。其实我想实现一个方法UploaderHelper::control($fielName, $options)
。所以我想在这个方法中显示直接从 $fielName 参数关联的图像的文件输入和值(thumbmails + caption)。
@Oliv 将原始实体作为依赖项传递给您的助手。
你的意思是在方法UploaderHelper::control($fieldName, $entity, $options)
中添加参数?
@Oliv 类似的东西,或者你可以为它添加一个单独的方法来保持实体跨越多个 control()
调用,类似于表单助手使用其 create()
方法所做的事情。
以上是关于FormHelper::getSourceValue() 在 CakePHP4 中的验证错误时不返回实体的主要内容,如果未能解决你的问题,请参考以下文章