摘要:框架最佳實(shí)踐最佳實(shí)踐在設(shè)計(jì)良好的應(yīng)用中,控制器很精練,包含的操作代碼簡(jiǎn)短如果你的控制器很復(fù)雜,通常意味著需要重構(gòu),轉(zhuǎn)移一些代碼到其他類中。層業(yè)務(wù)邏輯層框架由,,組成,執(zhí)行流程一般是在訪問獲取數(shù)據(jù),通過渲染頁面。
Yii2.0框架 MVC 最佳實(shí)踐 Controller最佳實(shí)踐
在設(shè)計(jì)良好的應(yīng)用中,控制器很精練,包含的操作代碼簡(jiǎn)短; 如果你的控制器很復(fù)雜,通常意味著需要重構(gòu), 轉(zhuǎn)移一些代碼到其他類中。控制器職責(zé) 1. 可訪問 請(qǐng)求 數(shù)據(jù)
// GET參數(shù) $get = Yii::$app->getRequest()->get(); $get = Yii::$app->getRequest()->getQueryParams(); // POST參數(shù) $post = Yii::$app->getRequest()->post(); $post = Yii::$app->getRequest()->getBodyParams();2. 可根據(jù)請(qǐng)求數(shù)據(jù)調(diào)用 模型 的方法和其他服務(wù)組件
$searchModel = new ArticleSearch(); $dataProvider = $searchModel->search(Yii::$app->request->queryParams); $websiteKv = Website::kv("id", "title"); $model = $this->findModel($id); $model->load(Yii::$app->request->post()); $model->save()3. 可使用 視圖 構(gòu)造響應(yīng)
return $this->render("edit", [ "model" => $model, "subjectKv" => $subjectKv ]);4. 不應(yīng)處理應(yīng)被模型處理的請(qǐng)求數(shù)據(jù)
例如,將表單提交的 Y-m-d 時(shí)間格式轉(zhuǎn)換為時(shí)間戳等,放到模型中進(jìn)行處理。
5. 應(yīng)避免嵌入HTML或其他展示代碼,這些代碼最好在 視圖中處理 Model最佳實(shí)踐模型是代表業(yè)務(wù)數(shù)據(jù)、規(guī)則和邏輯的中心地方,通常在很多地方重用, 在一個(gè)設(shè)計(jì)良好的應(yīng)用中,模型通常比 控制器代碼多。模型職責(zé) 1. 可包含屬性來展示業(yè)務(wù)數(shù)據(jù)
主要是數(shù)據(jù)表字段映射到模型類中的屬性,可適當(dāng)增加自定義public屬性。
2. 可包含驗(yàn)證規(guī)則確保數(shù)據(jù)有效和完整rules() 方法等
3. 可包含方法實(shí)現(xiàn)業(yè)務(wù)邏輯public function getSubject() { return $this->hasOne(Subject::className(), ["sid" => "sid"]); } public function getMedia() { return $this->hasMany(ArticleMedia::className(), ["aid" => "aid"]); } public function updateStatus($status) { return $this->updateAttributes(["status" => $status]); }4. 不應(yīng)直接訪問請(qǐng)求,Session和其他環(huán)境數(shù)據(jù),這些數(shù)據(jù)應(yīng)該由控制器傳入到模型
不允許使用任何 Yii::$app->getRequest() 下的方法,只可在控制器中使用。
5. 應(yīng)避免嵌入HTML或其他展示代碼,這些代碼最好在 視圖中處理 6. 單個(gè)模型中避免太多的 場(chǎng)景在開發(fā)大型復(fù)雜系統(tǒng)時(shí)應(yīng)經(jīng)??紤]這條建議,在這些系統(tǒng)中,模型會(huì)很大并在很多地方使用,因此會(huì)包含需要規(guī)則集和業(yè)務(wù)邏輯,最后維護(hù)這些模型代碼成為一個(gè)噩夢(mèng),因?yàn)橐粋€(gè)簡(jiǎn)單修改會(huì)影響好多地方, 為確保模型好維護(hù),最好使用以下策略。
定義可被多個(gè) 應(yīng)用主體 或 模塊 共享的的模型基類集合。這些模型類應(yīng)包含通用的最小規(guī)則集合和邏輯。
在每個(gè)使用模型的 應(yīng)用主體 或 模塊中, 通過繼承對(duì)應(yīng)的模型基類來定義具體的模型類, 具體模型類包含應(yīng)用主體或模塊指定的規(guī)則和邏輯。
例如,在高級(jí)應(yīng)用模板, 你可以定義一個(gè)模型基類 commonmodelsPost, 然后在前臺(tái)應(yīng)用中,定義并使用一個(gè)繼承 commonmodelsPost 的具體模型類 frontendmodelsPost, 在后臺(tái)應(yīng)用中可以類似地定義 backendmodelsPost。 通過這種策略,你清楚 frontendmodelsPost 只對(duì)應(yīng)前臺(tái)應(yīng)用,如果你修改它, 就無需擔(dān)憂修改會(huì)影響后臺(tái)應(yīng)用。
View最佳實(shí)踐視圖負(fù)責(zé)將模型的數(shù)據(jù)展示用戶想要的格式視圖職責(zé) 1. 應(yīng)主要包含展示代碼,如HTML, 和簡(jiǎn)單的PHP代碼來控制、格式化和渲染數(shù)據(jù) 2. 不應(yīng)包含執(zhí)行數(shù)據(jù)查詢代碼,這種代碼放在模型中
當(dāng)在 GridView 中感覺需要使用數(shù)據(jù)庫查詢時(shí),首先要想一想通過聯(lián)表(with(),joinWith())是否能替代該查詢。若能,則使用聯(lián)表;若不能,可適當(dāng)使用數(shù)據(jù)查詢。
3. 應(yīng)避免直接訪問請(qǐng)求數(shù)據(jù),如 $_GET, $_POST,這種應(yīng)在控制器中執(zhí)行, 如果需要請(qǐng)求數(shù)據(jù),應(yīng)由控制器推送到視圖 4. 可讀取模型屬性,但不應(yīng)修改它們 5. 為使模型更易于維護(hù),避免創(chuàng)建太復(fù)雜或包含太多冗余代碼的視圖, 可遵循以下方法達(dá)到這個(gè)目標(biāo):使用 布局 來展示公共代碼(如,頁面頭部、尾部);
將復(fù)雜的視圖分成幾個(gè)小視圖,可使用上面描述的渲染方法將這些 小視圖渲染并組裝成大視圖;
創(chuàng)建并使用 小部件 作為視圖的數(shù)據(jù)塊;
創(chuàng)建并使用助手類在視圖中轉(zhuǎn)換和格式化數(shù)據(jù)。
Service層(業(yè)務(wù)邏輯層)MVC框架由Model,View,Controller組成,執(zhí)行流程一般是:在Controller訪問Model獲取數(shù)據(jù),通過View渲染頁面。
MVC模式是Web開發(fā)中的基礎(chǔ)模式,采用的是分層設(shè)計(jì),各層之間職責(zé)分明。然而事與愿違,當(dāng)我們?nèi)辗e月累的基于MVC模式開發(fā)之后,會(huì)逐漸的感受到層與層之間存在粘連和職責(zé)模棱兩可的地方,這就是Service層出現(xiàn)的重要原因。
Yii2框架建議將大部分業(yè)務(wù)邏輯放到模型類中,當(dāng)業(yè)務(wù)邏輯比較簡(jiǎn)單時(shí),這樣確實(shí)能使代碼結(jié)構(gòu)清晰,又增加了代碼的復(fù)用率。但是在開發(fā)大型復(fù)雜系統(tǒng)時(shí),業(yè)務(wù)邏輯會(huì)比較復(fù)雜,模型類的代碼量會(huì)非常大,通常又會(huì)涉及到多個(gè)模型類,增大了模型類之間的耦合,不利于維護(hù)。
Service職責(zé) 1. 對(duì)模型類進(jìn)行解耦把需要多個(gè)model參與的復(fù)雜業(yè)務(wù)邏輯多帶帶封裝出來,這些model之間不再發(fā)生直接的依賴,而是在Service層內(nèi)協(xié)同完成邏輯。
2. 簡(jiǎn)化模型類的業(yè)務(wù)邏輯模型類應(yīng)該只處理簡(jiǎn)單的業(yè)務(wù)邏輯,當(dāng)方法的業(yè)務(wù)邏輯比較復(fù)雜時(shí)(例如一些統(tǒng)計(jì)功能的靜態(tài)方法等),建議將該業(yè)務(wù)邏輯放到Service層處理。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28658.html
摘要:由于系統(tǒng)變得越來越復(fù)雜,人們提出了稱為預(yù)處理器和后處理器的工具來管理復(fù)雜性。后處理器在由預(yù)處理器手寫或編譯后對(duì)應(yīng)用更改。我之前建議的文章,,也涵蓋了預(yù)處理器相關(guān)的知識(shí)。 譯者:前端小智 原文:medium.freecodecamp.org/from-zero-t… medium.freecodecamp.org/from-zero-t… 我記得我剛開始學(xué)習(xí)前端開發(fā)的時(shí)候。我看到了很多文章及...
摘要:一般來說,聲明式編程關(guān)注于發(fā)生了啥,而命令式則同時(shí)關(guān)注與咋發(fā)生的。聲明式編程可以較好地解決這個(gè)問題,剛才提到的比較麻煩的元素選擇這個(gè)動(dòng)作可以交托給框架或者庫區(qū)處理,這樣就能讓開發(fā)者專注于發(fā)生了啥,這里推薦一波與。 本文翻譯自FreeCodeCamp的from-zero-to-front-end-hero-part。 繼續(xù)譯者的廢話,這篇文章是前端攻略-從路人甲到英雄無敵的下半部分,在...
摘要:是文檔的一種表示結(jié)構(gòu)。這些任務(wù)大部分都是基于它。這個(gè)實(shí)踐的重點(diǎn)是把你在前端練級(jí)攻略第部分中學(xué)到的一些東西和結(jié)合起來。一旦你進(jìn)入框架部分,你將更好地理解并使用它們。到目前為止,你一直在使用進(jìn)行操作。它是在前端系統(tǒng)像今天這樣復(fù)雜之前編寫的。 本文是 前端練級(jí)攻略 第二部分,第一部分請(qǐng)看下面: 前端練級(jí)攻略(第一部分) 在第二部分,我們將重點(diǎn)學(xué)習(xí) JavaScript 作為一種獨(dú)立的語言,如...
摘要:代碼不會(huì)寫的很復(fù)雜架構(gòu)思考模塊化多進(jìn)程掘金關(guān)于模塊化組件化這個(gè)問題,我想每個(gè)開發(fā)者可能都認(rèn)真的思考過。今天,我安居客項(xiàng)目架構(gòu)演進(jìn)掘金本文已授權(quán)微信公眾號(hào)獨(dú)家發(fā)布。 關(guān)于 Dagger2+Mvp+rxjava+retroft2.0 的一點(diǎn)實(shí)踐 - Android - 掘金前言做這個(gè)項(xiàng)目的初衷是想練手,因?yàn)楝F(xiàn)在rxjava+retrofit框架相當(dāng)火,而公司的同事正在用這個(gè)框架也覺得很方便...
閱讀 2277·2021-09-30 09:48
閱讀 3653·2021-09-24 10:27
閱讀 1810·2021-09-22 15:32
閱讀 2038·2021-08-09 13:44
閱讀 3588·2019-08-30 15:55
閱讀 1062·2019-08-29 17:12
閱讀 2023·2019-08-29 17:05
閱讀 2932·2019-08-29 13:43