2014-03-01 75 views
0

我有以下的控制器類:MVC - 創建一個新的控制器VS創建一個新的方法

SchoolController extends Controller: 

// Mainly for AJAX requests 
+ searchSchoolDataAction() 
+ searchGradeDataAction() 
+ searchPeriodDataAction() 

// Entry point for a school website 
+ schoolAction(shortName) 

// Pre-enrolment process users from a certain school can perform 
+ startPreEnrolmentAction(shortName) 
+ preEnrolmentStudentAction(school) 
+ preEnrolmentTutorAction(school) 

等。

現在。這是一個衆所周知的原則,我們應該保持控制器很薄,並且模型很厚。此外,管制員還應遵循單一責任原則。而我的控制器一直在增加很多的重量。所以,這裏有個問題:關於MVC和OOP的最佳實踐,我應該何時創建一個新的控制器,何時應該向控制器添加一個新的方法?此外,什麼是控制器方法的一個好例子,還是這個東西留給程序員呢? (如果是後者,這聽起來有點違反直覺,因爲這是一個需要遵循的原則,但我不確定。)預先感謝您。

回答

1

控制器只應處理用戶請求並僅在需要顯示網頁時添加新方法。例如,您需要爲單個表格假設國家創建CRUD。

您的控制器將是國家。 控制器操作表示網頁像,fetchAllAction,AddAction,UpdateAction,DeleteAction。

如果您的項目長時間運行,那麼您應該在企業架構上構建您的模型。企業架構包括四個層次。 i)數據模型。 ii)域邏輯模型。 3)映射器。 四)服務。 注意:服務層是控制器唯一的網關和公衆面孔。

+0

「注意:服務層是您的控制器唯一的網關和公衆面孔。」這意味着控制器不應該看到模型,而應該看到模型的服務。它是否正確?如果是這樣,這非常好地解釋了控制器方法應該做什麼(即使這不是我所問的,但你解決了我的另一個疑問)。 現在,至於其餘的答案... 1網頁= 1方法。何時添加新的控制器? 1個控制器= 1個班級,或1個控制器=一些班級? –

+0

在服務層中所有的數據模型對象,映射器對象和業務邏輯都被實例化。簡單地說,服務層可以與其他層進行通信,但控制器只訪問服務層。 –

+0

您的控制器應該是域特定的。例如,如果您正在創建博客,則所有與博客有關的方法都將寫入博客控制器中。注意:控制器應該是特定於域的,它有助於應用程序的可維護性。你應該學習「領域驅動的應用程序」 1控制器= 1類,或1控制器=一些類。兩者都是對的,這取決於你的應用需求。 –

1

根據我的經驗,當設計控制器方法和新控制器時,SRP非常重要。

考慮一下你的基本控制器方法應該只包含像從數據庫/服務查詢填充視圖模型和將viewmodel呈現給你的視圖這樣的邏輯。

關於創建控制器的SRP應該具有更廣泛的意義。根據我的經驗,這是維護,可擴展性和用戶體驗考慮的組合。

考慮CRM系統中「會計」部分的情況。您可能希望使用一個控制器來表示會計部門的所有方面,但您也可以將其分解爲「發票」,「稅」,「工資單」等。使用多個控制器可以改善用戶體驗,因爲他們通過URI知道你的網頁實際上在做什麼。多個控制器允許您將您的海量控制器精簡爲多個特定的控制器。

+0

如果我理解正確,一個控制器應該回答一個基本的URI。 'InvoiceController'只能回答'/ invoice','TaxController'只能回答'/ tax'。這實際上簡化了需要新控制器類時的思考過程。現在,假設我有一個項目管理系統,而一個'Project'類有很多'Issue'。所以,如果我想編輯'Issue',我必須先訪問'Project'。爲「Project」添加一個控制器,爲「Issue」添加一個控制器,還是在兩個控制器類中混合使用? (考慮URI是'/ project//issues') –

+0

我想說,在一天結束時,這取決於你在某些情況下如何設計你的網站結構。首先,如果您只想使用一個控制器,則可以將路由/發票和/或稅款發送給一個控制器。對於您的示例項目管理系統,我可能會爲Issue添加另一個控制器。畢竟一個問題在典型的項目管理系統中是一個相當大的課題。用戶也可能會添加問題並將其分配給所需的項目。 – HOKBONG

+0

這就是我的問題。我何時考慮添加新的控制器?例如,下面的邏輯工作? 「如果我必須在某個類上添加CRUD,它就屬於一個新的控制器」。或者,我認爲這太複雜了?在我的OP中,我可以說每個搜索方法都屬於一個單獨的類,除了'searchSchoolDataAction'和'schoolAction'。 PreEnrolment方法也可以屬於一個新類,例如'EnrolmentController'。我是否正確地思考這一邏輯,儘管每種方法可能採用的路線? –