前言
本文主要給大家介紹了關(guān)于Laravel學(xué)習(xí)之model validation使用的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧。
在對(duì)database進(jìn)行寫操作前,需要對(duì)數(shù)據(jù)進(jìn)行validation,如type-check 每一個(gè) model column 的定義('type' 這個(gè)column必須是enum('card','loan'))
,這里使用model event來做。
在EventServiceProvider(或自定義一個(gè)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,即任何一個(gè)model的寫操作都會(huì)觸發(fā)該事件。
然后寫一個(gè)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);
}
}
這樣,在每一個(gè)繼承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',
];
}
在寫操作時(shí),提前對(duì)每一個(gè) model 的 schema definition進(jìn)行type-check,避免無效碰撞 database。這個(gè)feature的目的是從model schema去校驗(yàn)輸入數(shù)據(jù)的字段定義是否合法。
另外一般除了type-check schema definition 外,還得根據(jù)業(yè)務(wù)需要進(jìn)行邏輯校驗(yàn)sanity-check constraint rules,如當(dāng)創(chuàng)建一個(gè)account時(shí),輸入inputs里的字段person_id不能是child未成年人,等等。這里業(yè)務(wù)不同,constraint rules不同,不做過多解釋。這個(gè)feature的目的主要是從邏輯上校驗(yàn)輸入數(shù)據(jù)的合法性。
OK,總之一般情況下,在寫數(shù)據(jù)庫(kù)前都需要做 model validation,避免無效hit db。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
您可能感興趣的文章:- Laravel框架學(xué)習(xí)筆記(二)項(xiàng)目實(shí)戰(zhàn)之模型(Models)
- Laravel5.1數(shù)據(jù)庫(kù)連接、創(chuàng)建數(shù)據(jù)庫(kù)、創(chuàng)建model及創(chuàng)建控制器的方法
- 如何利用預(yù)加載優(yōu)化Laravel Model查詢?cè)斀?/li>
- Laravel ORM對(duì)Model::find方法進(jìn)行緩存示例詳解
- Laravel使用memcached緩存對(duì)文章增刪改查進(jìn)行優(yōu)化的方法
- Laravel框架數(shù)據(jù)庫(kù)CURD操作、連貫操作總結(jié)
- PHP開發(fā)框架Laravel數(shù)據(jù)庫(kù)操作方法總結(jié)
- Laravel框架實(shí)現(xiàn)model層的增刪改查(CURD)操作示例