第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

mvc的業(yè)務(wù)邏輯應(yīng)該放哪里?

mvc的業(yè)務(wù)邏輯應(yīng)該放哪里?

PHP
Hong林偉本以為 2017-01-30 17:01:57
背景: 基于laravel的后臺(tái)管理系統(tǒng),CURD密集型業(yè)務(wù)問題:當(dāng)直接在控制器方法中調(diào)用orm處理業(yè)務(wù)邏輯時(shí),代碼復(fù)用性差,控制器層很肥嘗試解決1:新建一個(gè)model層,將原先在控制器中的處理邏輯移到model中,包括數(shù)據(jù)校驗(yàn)下面是model的基類class?BaseModel?implements?Responsable,UniqueCheckable { ??//?業(yè)務(wù)模型應(yīng)當(dāng)都具備產(chǎn)生模型響應(yīng)的能力 ??use?ModelResponse; ??//?當(dāng)前業(yè)務(wù)CRUD操作密集,幾乎都需要檢驗(yàn)唯一性 ??use?CheckUniqueness; ??//業(yè)務(wù)模型以orm為驅(qū)動(dòng)將數(shù)據(jù)進(jìn)行持久化 ??protected?static?$orm?=?null; //?一個(gè)業(yè)務(wù)模型能被一個(gè)id唯一標(biāo)識(shí) ??protected?$primaryId; ??public?function?__construct($primaryId){ ????$this->primaryId?=?$primaryId; ??} ?? //?實(shí)現(xiàn)UniqueCheckable接口,子類必須重寫該方法 ??public?static?function?getPrimaryField(){ ????exit(static::class."?doesn't?implements?getPrimaryField?function"); ??} }其他模型類中的屬性都是為了實(shí)現(xiàn)具體的方法服務(wù)的,下面是其中一個(gè)model的定義:class?Tables?extends?BaseModel { ????private?$tenantId; ????private?$branchId; ????protected?static?$orm?=?'App\DAL\Tenant\Tables'; ????/** ?????*?@param?int?$tenantId?[商戶id] ?????*?@param?int?$branchId?[門店id] ?????*/ ????public?function?__construct($tenantId?,?$branchId){ ??????$this->tenantId?=?$tenantId; ??????$this->branchId?=?$branchId; ????} ????/** ?????*?[參數(shù)初始化] ?????*?@param??array??$data?[description] ?????*?@return?[type]???????[description] ?????*/ ???public?static?function?paramInit(array?&$data){ ?????$data['pricePerHour']=?array_key_exists('pricePerHour',$data)?$data['pricePerHour']:0; ?????$data['minConsumption']=?array_key_exists('minConsumption',$data)?$data['minConsumption']:0; ?????$data['number']=?array_key_exists('number',$data)?$data['number']:0; ???} /** ?*?@param?array?$data?[description] ?*/ ????public?function?add(array?$data){ ??????//?請(qǐng)求參數(shù)初始化 ??????static::paramInit($data); ???????//?業(yè)務(wù)規(guī)則校驗(yàn) ??????if(!static::isValueAllowed($this->branchId,'name',$data['name'])){ ??????????return?static::response(false,'該桌臺(tái)已經(jīng)存在'); ??????} ??????$table?=?static::$orm::create(['tenantId'=>$this->tenantId, ????????????????????????????????'branchId'=>$this->branchId, ????????????????????????????????'position'=>$data['position'], ????????????????????????????????'minConsumption'=>$data['minConsumption'], ????????????????????????????????'number'=>$data['number'], ????????????????????????????????'pricePerHour'=>$data['pricePerHour'], ????????????????????????????????'name'=>$data['name'] ????????????????????????????]); ??????return?$table?static::response(true,$table):static::response(false,'數(shù)據(jù)寫入失敗'); ????} }該方法的問題:model層只是業(yè)務(wù)邏輯的封裝?但有新的需求就往model中加新的方法,然后在控制器中調(diào)用,那么這個(gè)model類不就只是方法的堆積?嘗試解決2:initPHP框架中提出了dscv的架構(gòu),其實(shí)就是把業(yè)務(wù)邏輯放在service中,然后在控制器中調(diào)用service對(duì)象來(lái)完成請(qǐng)求的處理這種方法正在考慮實(shí)施嘗試解決3: 在看到了這篇文章后:也許后端MVC的說法已經(jīng)過時(shí)了,感覺作者正好說到了我的痛點(diǎn),所以又打算把控制器層分割為控制器+service層,把model分割為使用orm的數(shù)據(jù)持久層和repository層。這幾者之間的關(guān)系是repository調(diào)用orm進(jìn)行數(shù)據(jù)持久化,service層通過repository實(shí)現(xiàn)相關(guān)操作,然后控制器層調(diào)用service處理請(qǐng)求。但是這時(shí)候?qū)@個(gè)repository層感到疑惑,如果重新對(duì)orm實(shí)現(xiàn)的功能進(jìn)行封裝那么工作量將很大,而實(shí)際帶來(lái)的好處也不是很顯而易見的。所以我目前傾向于認(rèn)為orm中對(duì)應(yīng)的對(duì)象是數(shù)據(jù)庫(kù)中的表,而repository對(duì)應(yīng)的對(duì)象是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中談到的entity或者aggregate,那么這個(gè)時(shí)候我是不是又該根據(jù)把m變?yōu)?領(lǐng)域?qū)樱玶epository+基礎(chǔ)設(shè)施層?這個(gè)問題已經(jīng)糾結(jié)挺久了,謝謝各位大神的指教
查看完整描述

1 回答

?
醉大俠

TA貢獻(xiàn)2條經(jīng)驗(yàn) 獲得超0個(gè)贊

我只知道現(xiàn)在解決3應(yīng)該是最合適的,其它的我給不了意見-_-
查看完整回答
反對(duì) 回復(fù) 2017-01-31
  • Hong林偉本以為
    Hong林偉本以為
    謝謝,不過我覺得現(xiàn)在的業(yè)務(wù)還用不著這么干,現(xiàn)在更想知道的是model層應(yīng)該怎樣去定義
  • 1 回答
  • 1 關(guān)注
  • 3796 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)