前言
本文主要介紹給大家介紹了Laravel學習之model validation所使用的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
在對database進行寫入操作前,需要對資料進行validation,如type-check 每一個model column 的定義('type' 這個column必須是enum('card','loan' ))
,這裡使用model event來做。
在EventServiceProvider(或自訂一個ValidationServiceProvider)中寫上:
public function boot() { /** * Inspired by @see \Illuminate\Foundation\Providers\FormRequestServiceProvider::boot() * * Note: saving event is always triggered before creating and updating events */ $this->app['events']->listen('eloquent.saving: *', function (string $event_name, array $data): void { /** @var \App\Extensions\Illuminate\Database\Eloquent\Model $object */ $object = $data[0]; $object->validate(); }); }
#'eloquent.saving: *'
是表示listen所有model的saving,也就是任何一個model的寫入操作都會觸發該事件。
然後寫一個abstract model extends EloquentModel:
// \App\Extensions\Illuminate\Database\Eloquent\Model use Illuminate\Database\Eloquent\Model as EloquentModel; use Illuminate\Validation\ValidationException; abstract class Model extends EloquentModel { public function validate():void { // 1. validate type rules (type-check) $validator = $this->getTypeValidator(); if ($validator->fails()) { throw new ValidationException($validator); } // $validator = $this->getConstraintValidator(); // 2. validate constraint rules (sanity-check) } protected function getTypeValidator() { return $this->getValidationFactory()->make($this->attributes, static::COLUMN_TYPE_RULES); } protected function getValidationFactory() { return app(Factory::class); } protected function getConstraintValidator() { // return $this->getValidationFactory()->make($attributes, static::COLUMN_CONSTRAINT_RULES); } }
#這樣,在每一個繼承abstract model的子類別中,定義const COLUMN_TYPE_RULES就行,如:
class Account extends Model { public const COLUMN_TYPE_RULES = [ 'id' => 'integer|between:0,4294967295', 'source' => 'nullable|in:schwab,orion,yodlee', 'type' => 'required|in:bank,card,loan', ]; }
#在寫入操作時,提前對每一個model 的schema definition進行type-check,避免無效碰撞database。這個feature的目的是要從model schema去校驗輸入資料的欄位定義是否合法。
另外一般除了type-check schema definition 外,還得根據業務需要進行邏輯校驗sanity-check constraint rules,如當創建一個account時,輸入inputs裡的字段person_id不能是child未成年人,等等。這裡業務不同,constraint rules不同,不做太多解釋。這個feature的目的主要是從邏輯上校驗輸入資料的合法性。
OK,總之一般情況下,在寫資料庫前都需要做 model validation,避免無效hit db。
總結
#以上是Laravel中關於model validation的使用範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!