“不能将 Laminas\Diactoros\UploadedFile 类型的对象用作数组”在 Cakephp 4 中具有多上传输入

Posted

技术标签:

【中文标题】“不能将 Laminas\\Diactoros\\UploadedFile 类型的对象用作数组”在 Cakephp 4 中具有多上传输入【英文标题】:"Cannot use object of type Laminas\Diactoros\UploadedFile as array" with multi-upload input in Cakephp 4“不能将 Laminas\Diactoros\UploadedFile 类型的对象用作数组”在 Cakephp 4 中具有多上传输入 【发布时间】:2021-12-27 16:08:18 【问题描述】:

我正在创建一个插件FileManager,其中所有上传都存储在一个表中。这个插件有一个AttachmentBehavior 附加了一个hasMany 关联。

我在 Articles/add.phpArticles/edit.php 模板中使用多文件输入来上传将链接到文章的文件:

// Example in Articles/edit.php
echo $this->Form->create($article, ['type' => 'file']);
echo $this->Form->control('title', /*[...]*/);
echo $this->Form->control('body', /*[...]*/);
echo $this->Form->control('pieces_jointes', ['type' => 'file', 'multiple' => true, 'name' => 'pieces_jointes[]']);

我可以用文件添加新文章,没问题。

我可以编辑没有文件的文章添加文件,没有问题。

但是当我编辑已经有文件的文章以添加更多文件时,出现错误“无法使用 Laminas\Diactoros\UploadedFile 类型的对象作为数组” 修补实体Article 时会出现此错误。 这是我的控制器:

// in ArticlesController.php
public function edit($id)

    $article = $this->Articles->findById($id)->firstOrFail();

    if ($this->request->is(['post', 'put'])) 
        debug($article); // $article->pieces_jointes is an array of entities of my files table.
        debug($this->request->getData()); // $this->request->getData()->pieces_jointes is an array of UplaodedFile objects
        $article = $this->Articles->patchEntity($article, $this->request->getData()); // The error occurs here

        if ($this->Articles->save($article)) 
            return $this->redirect(/*[...]*/);
        
    

    $this->set(compact('item'));

我不太清楚发生了什么。 有谁可以解释我并帮助我解决这个问题?

【问题讨论】:

【参考方案1】:

您不应该为上传字段和关联属性使用相同的名称,这会在框架的各个地方发生冲突。

重命名表单等中的字段,使其使用的名称既不匹配任何关联属性,也不匹配任何列名,然后让您的行为和内容使用“外部”名称处理输入,并转换它将输入转换为保存数据所需的结构后,改为“内部”名称。

【讨论】:

谢谢!它在我的表单的文件字段中使用后缀_file 工作。它避免了必须删除AttachmentBehavior::beforeMarshal中的关联文件模型。【参考方案2】:

删除AttachmentBehavior::beforeMarshal 中的关联文件模型似乎可以修复错误:

// in AttachmentBehavior
public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)

    foreach ($this->_fields as $field => $value) 
        // Remove associated file Model (PiecesJointes, ...) in $options['associated']
        $options['associated'] = collection($options['associated'])
                    ->reject(function ($modelAssociated, $key) use ($value) 
                        return $modelAssociated == $value['alias'];
                    )
                    ->toArray();

        // [...]
    

但我需要确认我是对的 (?)

【讨论】:

以上是关于“不能将 Laminas\Diactoros\UploadedFile 类型的对象用作数组”在 Cakephp 4 中具有多上传输入的主要内容,如果未能解决你的问题,请参考以下文章