2012-08-14 33 views
0

我剛剛遇到了我目前用於我的應用程序的MVC架構的侷限之一。目前,我的網址是這樣的:MVC架構的多級控制器

www.example.com/controller/action 

每個請求到達前端控制器,它從URL加載請求的控制器類,並執行它的動作(方法)。這工作正常,直到你需要開始使用嵌套控制器。

例如: 有一個'用戶'控制器可以保存createUser(),editUser(),deleteUser()等方法。所有完全可能的當前URL結構......但是如果我們還需要管理用戶類型?我們需要一個單獨的控制器'usertypes',它也包含createUserType(),editUserType()等方法。但是,由於用戶類型是用戶的一部分,'usertypes'控制器應嵌套在用戶控制器中,因此:

www.example.com/users/usertypes/addusertype 

然而,對於當前的URL結構,這是不可能的......我怎樣才能讓(如果你願意或多級)控制器使用嵌套的?

更新:這是我正在使用的應用程序的基本表示形式:這是一個管理部門的基本業務應用程序,可以添加,查看,編輯和刪除3類別(促銷,郵件和持卡人)的數據。每個類別代表數據庫中的一個表格,並具有自己獨特的字段。帳戶需要由管理員創建,用戶無法自行創建帳戶,也無法查閱其用戶個人資料。

對於這些類別中的每一個,我都製作了一個控制器,其中包含add(),edit(),getAll(),getSingle(),delete()等操作...每個操作都會調用相應的方法從模型中渲染相應的視圖。

這是所有可能與當前的URL結構,其中有網址,如:

example.com/promotions/add 
example.com/promotions/getsingle?id=123 

最近,他們問我,使它能夠同時管理類型的促銷活動,郵件和持卡人。現在他們已經有學校折扣,20%的折扣等等,但他們想要增加更多,因爲他們希望。

這意味着我需要一個PromotionTypes控制器,該控制器還包含add(),getAll(),getSingle(),delete()等操作...如果PromotionTypes控制器可以嵌套在原始促銷中控制器,這使得網址像這樣:

example.com/promotions/promotiontypes/add 

,而不是

從我目前的前端裝載機,這是不可能的,因爲URL的第一部分將自動被作爲控制器處理,第二部分作爲從中執行的動作。

+0

你有控制器和模型混淆。你所有的方法都應該存在於你可以隨時訪問的模型中。控制器應該像處理過的那樣處理特定情況,但要足夠靈活,可以使用任何你需要的模型。您是否使用自動加載器加載您的課程/模型? – 2012-08-14 23:49:56

+0

如果您將控制器和路由的概念分開,並且有一個可配置的路由器來確定給定url的正確控制器和操作,則不需要嵌套控制器。這是主要框架的作用。 – wgcrouch 2012-08-14 23:51:27

回答

1

您沒有提及您是否使用框架,但通常的方法是讓「路由器」對異常進行特殊處理,例如, Zend Framework routers

1

看起來好像你已經將控制器綁定到視圖上,而不是每個domain object

另外,什麼是奇怪的路由?爲什麼不:

POST "www.example.com/profile/42/type" 

因爲您正在向特定用戶的配置文件中添加類型。這轉換爲在Profile控制器上執行方法postType()

如果您正在構建您自己的路由機制,可能this answer可能會有所幫助。

底線是這樣的:你不需要這種奇怪的控制器控制器。你需要的是開始查看你有什麼樣的視圖,然後爲每個視圖創建控制器,而不是從查看模型層開始。

+0

我已經用我當前的URL結構和前端加載器的表示更新了我的原始問題。你可以看看嗎?我似乎無法理解將控制器綁定到視圖的好處......感謝 – user1440560 2012-08-15 12:12:19

+0

@ user1440560控制器與視圖相關聯,以避免這種誤導性的控制器控制器控制器的可憎行爲。另外,這是因爲視圖和控制器屬於同一圖層,而模型實際上是完全獨立的圖層。然後再次,我確信你並沒有真正的看法。只是一個你爲了外觀而稱之爲「視圖」的模板。 – 2012-08-15 13:13:22