CakePHP 3 - 验证未绑定到表的数据(无需任何数据库参与的验证)



>昨天我发布了一个问题 CakePHP 3 - 使用可重用的验证器,但我仍然在努力了解如何验证数据,当它绑定到特定的数据库表或表中的一组字段时。

我正在尝试做的是上传一个CSV文件。CSV 中的数据很可能最终会进入数据库,但在发生任何这种情况之前,我想验证文件以确保其有效 - 扩展名为 .csv,MIME 类型为text/csv,文件大小为 <1 Mb。此特定验证与数据库完全无关

这种验证去哪儿了,因为它与数据库表无关?

我使用的方法如下 - 但这不起作用:

我有一个upload()方法的UploadsController.php。此方法处理上传(将帖子表单发布到/uploads/upload)

我已经在我的src/Model/Table/UploadsTable.php中添加了以下内容(因为我不知道在哪里放置这样的代码):

public function validationDefault(Validator $validator)
{
$validator
->add('submittedfile', [
'mimeType' => [
'rule' => array('mimeType', array('text/csv')),
'message' => 'Upload csv file only',
'allowEmpty' => TRUE,
],
'fileSize' => [
'rule' => array('fileSize', '<=', '1MB'),
'message' => 'File must be less than 1MB.',
'allowEmpty' => TRUE,
]
]);
return $validator;
}

UploadsController::upload()我有这个:

if ($this->request->is('post')) {
debug($this->request->data['submittedfile']);
$uploads = TableRegistry::get('Uploads');
$entity = $uploads->newEntity($this->request->data['submittedfile']);
debug($entity);
}

无论我上传什么文件,都不会返回任何错误。即使我注释掉整个validationDefault方法,行为也不会改变。

这变得非常令人沮丧,因为Cake网站上的所有文档都讨论了与数据库表相关的数据。好吧,如果您尝试验证与数据库表无关的内容怎么办?

我把它作为一个新问题打开,因为最后一个问题并没有真正解决这个问题。

有关此问题的其他问题无法解决此问题,因为在这种情况下,它们将文件信息写入数据库表,因此同时验证文件。就我而言,我不想这样做,我只是想在考虑与数据库有关的任何事情之前验证文件。我还希望代码验证 CSV 是否可重用(即不在一个特定的控制器方法中),因为如果我想在应用程序的 5 个不同部分中检查有效的 CSV,我为什么要重复代码做同样的事情?

使用内置验证的无模型表单来验证您上传的文件。如果您希望验证代码可重用,请将其放在 trait 或单独的类中

理论上,您可以执行以下操作:

$form = new CsvForm();
if ($this->request->is('post')) {
$result = $form->execute($this->request->getData());
if ($result && $this->Model->saveMany($result) {
$this->Flash->success('We will get back to you soon.');
} else {
$this->Flash->error('There was a problem submitting your form.');
}
}

让您的表单验证 CSV 文档并返回纯 CSV 数据,或者已经将行转换为您保存的一组实体。

最新更新