2017-05-11 80 views
0

昨天我張貼的問題CakePHP 3 - Using reusable validators但我仍然在努力瞭解如何驗證數據時,它是依賴於特定的數據庫表,或一套表中的字段。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的網站上的所有文檔都在討論與數據庫表有關的數據,所以這變得非常令人沮喪。那麼,如果你試圖驗證與數據庫表無關的事情呢?

我已經打開這個作爲一個新的問題,因爲最後一個沒有真正解決這個問題。

Other questions posted about this不解決這個問題,因爲在這種情況下,他們正在編寫的文件信息到數據庫表,因此驗證文件同時。在我的情況下,我沒有試圖這樣做,我只是想在驗證文件之前,在考慮任何與數據庫有關的事情之前。我還希望代碼驗證CSV是否可重用(即不在一個特定的Controller方法中),因爲如果我想在應用程序的5個不同部分檢查有效的CSV,爲什麼我應該重複執行相同的代碼一切都結束了嗎?

回答

1

使用a model-less form,它內置驗證,以驗證您上傳的文件。如果您希望您的驗證碼是可重複使用的把它放在一個特質or separate class

從理論上講,那麼你可以做這樣的事情:

$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數據,或者已經將行轉換爲您保存的一組實體。