>昨天我发布了一个问题 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 数据,或者已经将行转换为您保存的一组实体。