簡體   English   中英

模型中的數據驗證

[英]Data validation in the model

我對 Laravel 並不陌生,但我可能在某個地方犯了架構錯誤。

我有一個類(模型上方的第二層),其中存儲了所有業務邏輯。 我需要驗證傳入的數據,例如:是電子郵件、電子郵件格式、唯一性等等。 驗證器對此非常有用。

我可以在控制器中執行此操作: $request-validate() 但是我想在模型本身中進行驗證,因為可以從UserControllerGraphQL::createUserMutation等不同地方調用該方法。

在兩個地方編寫相同的代碼是個壞主意,不是嗎?

在用戶控制器中:

$validator = Validator::make(
  $request->all(),
  [
    'email' => 'email|max:255|unique:users',
    'password' => 'required|min:6|max:20|confirmed',
    'password_confirmation' => 'required|same:password',
  ],
);
    
if ($validator->fails()) {
 ...
}

User::query()->createUser($request->all());

和 GraphQL createUserMutation:

$validator = Validator::make(
  $request->all(),
  [
    'email' => 'email|max:255|unique:users',
    'password' => 'required|min:6|max:20|confirmed',
    'password_confirmation' => 'required|same:password',
  ],
);
    
if ($validator->fails()) {
 ...
}

User::query()->createUser($request->all());

因此,我更喜歡在一個地方檢查:在模型中。

如果我返回一個數組,一切都會成功:

if ($validator->fails()) {
   return $validator->messages();
}

但是如果我想拋出異常怎么辦? 我將錯誤消息轉換為字符串並拋出異常:

$result = [];
foreach ($messages->toArray() as $field => $messagesList) {
  foreach ($messagesList as $msg){
   $result[] = '- '.$msg;
  }
}
throw new \Exception(implode("\n<br/>", $result));

我的方法有多正確? 也許我是在重新發明輪子,但到目前為止我還沒有找到更好的解決方案。 或者,仍然堅持在控制器中進行驗證,復制驗證代碼?

我認為你在 Laravel 中缺少表單請求驗證

第一步:通過 artisan 命令php artisan make:request YourRequestName創建請求

這將在目錄app\Http\Requests中創建一個名為YourRequestName.php的類

第二步:打開這個文件,默認情況下你會發現一個規則函數,你將在其中返回一個規則數組

第三步:添加一個名為messages的函數,您將在其中返回一組驗證消息

第四步:在項目中的任何方法中,您想使用YourRequestName進行驗證,只需將其作為參數而不是Request Class注入即可

請求類StoreRequest的示例: 一個請求類 StoreRequest 的例子

在控制器中,您將像這樣注入它: 在此處輸入圖像描述

並且不要忘記在控制器中使用StoreRequest 類

最后這是 laravel 文檔中的部分:

https://laravel.com/docs/9.x/validation#form-request-validation

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM