Laravel學(xué)習(xí)教程之model validation的使用示例
前言
本文主要給大家介紹了關(guān)于Laravel學(xué)習(xí)之model validation使用的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
在對(duì)database進(jìn)行寫(xiě)操作前,需要對(duì)數(shù)據(jù)進(jìn)行validation,如type-check 每一個(gè) model column 的定義('type' 這個(gè)column必須是enum('card','loan'))
,這里使用model event來(lái)做。
在EventServiceProvider(或自定義一個(gè)ValidationServiceProvider)中寫(xiě)上:
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的寫(xiě)操作都會(huì)觸發(fā)該事件。
然后寫(xiě)一個(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的子類(lèi)中,定義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', ]; }
在寫(xiě)操作時(shí),提前對(duì)每一個(gè) model 的 schema definition進(jìn)行type-check,避免無(wú)效碰撞 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不同,不做過(guò)多解釋。這個(gè)feature的目的主要是從邏輯上校驗(yàn)輸入數(shù)據(jù)的合法性。
OK,總之一般情況下,在寫(xiě)數(shù)據(jù)庫(kù)前都需要做 model validation,避免無(wú)效hit db。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(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è)斀?/a>
- Laravel ORM對(duì)Model::find方法進(jìn)行緩存示例詳解
- Laravel使用memcached緩存對(duì)文章增刪改查進(jìn)行優(yōu)化的方法
- Laravel框架數(shù)據(jù)庫(kù)CURD操作、連貫操作總結(jié)
- PHP開(kāi)發(fā)框架Laravel數(shù)據(jù)庫(kù)操作方法總結(jié)
- Laravel框架實(shí)現(xiàn)model層的增刪改查(CURD)操作示例
相關(guān)文章
通過(guò)php快速統(tǒng)計(jì)某個(gè)數(shù)據(jù)庫(kù)中每張表的數(shù)據(jù)量
在優(yōu)化數(shù)據(jù)庫(kù)的,或者在導(dǎo)入數(shù)據(jù)的時(shí)候,知道某個(gè)數(shù)據(jù)庫(kù)中哪張數(shù)據(jù)表的數(shù)據(jù)量最多,有時(shí)候?qū)ξ覀冞€是有幫助的2012-09-09PHP如何通過(guò)AJAX方式實(shí)現(xiàn)登錄功能
PHP是一門(mén)很好的語(yǔ)言,可以很方便的開(kāi)發(fā)web應(yīng)用程序,下面介紹一下Ajax+PHP+MySQL登陸示例,感興趣的小伙伴們可以參考一下2015-11-11Yii框架多語(yǔ)言站點(diǎn)配置方法分析【中文/英文切換站點(diǎn)】
這篇文章主要介紹了Yii框架多語(yǔ)言站點(diǎn)配置方法,結(jié)合實(shí)例形式分析了基于Yii框架實(shí)現(xiàn)中文/英文切換的多語(yǔ)言站點(diǎn)相關(guān)配置方法與操作注意事項(xiàng),需要的朋友可以參考下2020-04-04php微信公眾號(hào)開(kāi)發(fā)之翻頁(yè)查詢
這篇文章主要為大家詳細(xì)介紹了php微信公眾號(hào)開(kāi)發(fā)之翻頁(yè)查詢功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10laravel單元測(cè)試之phpUnit中old()函數(shù)報(bào)錯(cuò)解決
這篇文章主要給大家介紹了關(guān)于laravel單元測(cè)試之phpUnit中old()函數(shù)報(bào)錯(cuò)的解決過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09laravel 實(shí)現(xiàn)向公共模板中傳值 (view composer)
今天小編就為大家分享一篇laravel 實(shí)現(xiàn)向公共模板中傳值 (view composer),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10php獲取301跳轉(zhuǎn)URL簡(jiǎn)單實(shí)例
這篇文章主要介紹了php獲取301跳轉(zhuǎn)URL簡(jiǎn)單實(shí)例,有需要的朋友可以參考一下2013-12-12PHP批量生成靜態(tài)HTML的簡(jiǎn)單原理和方法
PHP生成HTML的技術(shù)要比ASP的技術(shù)相對(duì)來(lái)說(shuō)要簡(jiǎn)單一點(diǎn),下面簡(jiǎn)要說(shuō)一下怎樣用PHP批量生成HTML技術(shù)吧2014-04-04Zend Framework框架之Zend_Mail實(shí)現(xiàn)發(fā)送Email郵件驗(yàn)證功能及解決標(biāo)題亂碼的方法
這篇文章主要介紹了Zend Framework框架之Zend_Mail實(shí)現(xiàn)發(fā)送Email郵件驗(yàn)證功能及解決標(biāo)題亂碼的方法,詳細(xì)分析了Zend_Mail組件實(shí)現(xiàn)郵件發(fā)送的具體步驟,并給出了標(biāo)題亂碼的解決方法,需要的朋友可以參考下2016-03-03