昨天的程式碼有一些註解的內容,先取消註解試試。
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',
]);
$request
有validate()
的方法。還可以直接建立一個驗證器,繼承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提供簡單不失彈性的方式,來驗證表單資料。