溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用Laravel框架怎么格式化輸出表單驗(yàn)證

發(fā)布時間:2021-04-13 16:28:03 來源:億速云 閱讀:177 作者:Leah 欄目:開發(fā)技術(shù)

使用Laravel框架怎么格式化輸出表單驗(yàn)證?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

laravel默認(rèn)的輸出格式(圖一)

使用Laravel框架怎么格式化輸出表單驗(yàn)證

修改后的輸出格式(圖二)

或許通過上面兩張圖,你還是未看出有什么區(qū)別的話。這里我用文字描述一下吧。 這種情況是發(fā)生在laravel做表單驗(yàn)證的情況下發(fā)生的。前端向我后端接口發(fā)送一個POST請求時,發(fā)送了一個title和body的字段。我后端需要對兩個字段做一些非空驗(yàn)證。按照框架手冊來進(jìn)行的話,輸出的格式就是圖一的格式。然后后端統(tǒng)一的輸出格式是圖二中的格式,如果按照圖一的格式輸出肯定是不行,這樣就需要我們做一個特殊處理。

問題排查

首先我們可以通過文檔參看到如下信息。下面劃線的部分,提到的返回信息是將所有未驗(yàn)證通過的數(shù)據(jù)都返回給前端,就如圖一中的數(shù)據(jù)格式。

使用Laravel框架怎么格式化輸出表單驗(yàn)證

laravel默認(rèn)的輸出格式(圖三)

預(yù)期效果

通過圖三我們知道了 laravel 默認(rèn)的是返回一個帶 422 的 http 狀態(tài)碼并且將所有的驗(yàn)證錯誤信息都返回。

然而我們需要的只是如圖二的格式,單個的輸出錯誤信息。大致的解決思路就是在輸出的時候,我們?nèi)ツJ(rèn)顯示第一個未通過的驗(yàn)證信息,當(dāng)通過之后,之前第二個未嚴(yán)重通過的就變成了第一個,這樣依次循環(huán)下去,我們的每個數(shù)據(jù)就得到了驗(yàn)證。驗(yàn)證的地方我們選擇框架異常統(tǒng)一處理的地方,這樣每次驗(yàn)證都自動的進(jìn)行處理。

解決方案

該框架是 laravel5.8 的情況下進(jìn)行編寫,如果版本不同,或許還需要特殊的處理,不過處理的思路可以參考下面的。

1.創(chuàng)建一個表單驗(yàn)證器。執(zhí)行下面的命令之后,我們在php app/Http/Requests目錄下面就可以看到該類文件了。

php artisan make:request ProjectValidate

2.定義驗(yàn)證規(guī)則。rules 方法是定義驗(yàn)證規(guī)則,而 messages 方法則是定義返回的錯誤信息,該方法也可以省略掉,這樣提示的信息就是英文而不是圖一或圖二看到的中文了。

namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ProjectValidate extends FormRequest
{
  /**
   * Determine if the user is authorized to make this request.
   *
   * @return bool
   */
  public function authorize()
  {
    return true;
  }
  /**
   * Get the validation rules that apply to the request.
   *
   * @return array
   */
  public function rules()
  {
    return [
      'title' => 'bail|required',
      'body' => 'required',
    ];
  }
  /**
   * define the validation message
   *
   * @return array
   */
  public function messages()
  {
    return [
      'title.required' => '文章標(biāo)題必填',
      'body.required' => '文章內(nèi)容必填',
    ];
  }
}

3.使用驗(yàn)證器。這里我定義了一個控制器,在 addData 方法中,使用依賴注入的方式去實(shí)現(xiàn)數(shù)據(jù)的驗(yàn)證。記住,該方法體在未通過數(shù)據(jù)驗(yàn)證的情況下是不會去執(zhí)行的。

namespace App\Http\Controllers\Backend\Project;

use App\Http\Requests\ProjectValidate;
use App\Http\Controllers\Backend\UCenter;

class Index extends UCenter
{
  public function index()
  {
    return success();
  }
  public function addData(ProjectValidate $request)
  {
    $validated = $request->validated();
    return success($validated);
  }
}

4.統(tǒng)一處理數(shù)據(jù)格式。找到php App\Exceptions\Handler.php文件,找到下面的方法,修改為如下內(nèi)容。這時候在做表單驗(yàn)證就會顯示圖二的格式信息了。

public function render($request, Exception $exception)
  {
    if ($exception instanceof ValidationException) {
      // 只讀取錯誤中的第一個錯誤信息
      $errors = $exception->errors();
      $message = '';
      // 框架返回的是二維數(shù)組,因此需要去循環(huán)讀取第一個數(shù)據(jù)
      foreach ($errors as $key => $val) {
        $keys  = array_key_first($val);
        $message = $val[$keys];
        break;
      }
      return response()->json(['code' => 1001, 'message' => $message, 'data' => []], 422);
    }
    return parent::render($request, $exception);
  }

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI