iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 30
1
Modern Web

30天成為Laravel萌新系列 第 30

30天成爲Laravel萌新(第29天) - 表單驗證

昨天的程式碼有一些註解的內容,先取消註解試試。

resources/views/images/upload.blade.php部份內容

       @if ($errors->any())
            <div class="alert alert-danger">
                <ul>
                    @foreach ($errors->all() as $error)
                        <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
        @endif

routes/web.php處理post('/images/upload')請求的部份內容:

    Validator::make($request->all(), [
        'file' => 'required|image',
    ])->validate();

驗證表單資料

    Validator::make($request->all(), [
        'file' => 'required|image',
    ])->validate();

差不多等價於:

    $validate = $request->validate([
        'file' => 'required|image',
    ]);

$requestvalidate()的方法。還可以直接建立一個驗證器,繼承Request

php artisan make:request ImageUpload

上面執行完後,現在,在app/Http/Requests/目錄下多了ImageUpload.php,內容改成下面這樣:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ImageUpload extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'file' => 'required|image',
        ];
    }
}

是的,也不過就是將原本直接寫於路由的規則(rules),改寫至驗證器。另外,這個驗證器還有一個驗證身份的方法authorize()。在驗證資料前,會先驗證身份,為了測試,所以回傳true,使得每次身份驗證都成功。

authorize()預設回傳false,使得每次都會得到403錯誤。

403 This action is unauthorized.

現在可以在改寫原本處理請求的功能。把原本的Request替換成剛剛建立的ImageUpload。原本用於驗證資料的程式片段也不需要了。

use App\Http\Requests\ImageUpload;

Route::post('/images/upload', function(ImageUpload $request){
    if($request->hasFile('file')){
        $image = $request->file('file');
        $file_path = $image->store('public');
    }
    return redirect(Storage::url($file_path));
})->name('image.upload');

顯示錯誤訊息

表單驗證失敗後,會自動返回原本頁面,並將錯誤訊息儲存於變數$errors之中。所以,原本最一開始的內容,就是要顯示錯誤訊息,他可能會提示需要圖片。

       @if ($errors->any())
            <div class="alert alert-danger">
                <ul>
                    @foreach ($errors->all() as $error)
                        <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
        @endif

Validation還有很豐富的用法,包含修改欄位(field)的屬性(attribute)、客製化錯誤訊息(message)、還有將規則(Rule)獨立出來成一份檔案等等。總的來說,Laravel提供簡單不失彈性的方式,來驗證表單資料。


上一篇
30天成爲Laravel萌新(第28天) - 上傳檔案
下一篇
30天成爲Laravel萌新(第30天) - 登入驗證
系列文
30天成為Laravel萌新32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言