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,其中包含实体 photoshasMany 关联。

在编辑文章时,我使用$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,而是包含idcaption 的数组。

// $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 中的验证错误时不返回实体的主要内容,如果未能解决你的问题,请参考以下文章