2010-09-21 50 views
3

MVC是一個很好的模式,但有時候真的無聊到把一切都變成控制器的方法。控制器不斷髮展,需要時間來擺脫成千上萬的代碼行。有些人強烈建議儘可能將模型放入模型中,但我更願意保持模型清潔(我沒有將面向控制器的方法放入模型中)。「每個動作/頁面一個類別」的任何模式?

的想法是把每個控制器的行動統一到自己的類...

class Post_Add {} 
class Post_Remove {} 
class Post_View {} 

所有的代碼,這是所有操作類我們投入class Post_Parent並通過它的實例付諸行動構造常見。

所以,調用動作看起來像...

$parent = new Post_Parent(); 
$action = new Post_Add($parent); 
$action->run(); 

那麼,我們有什麼?

  • 每個動作是分隔的類,所以 因爲我們希望我們可以添加儘可能多的私有方法, 瓦爾,常量。
  • 所有常見代碼被分爲 父類(Post_Parent),並且可以從操作類訪問 。它 非常適合舉辦ACL等.-

這個想法值得一住嗎?有沒有類似的設計模式?

謝謝。

回答

0

看一看在Transaction ScriptPageController模式。事務腳本是最基本的域邏輯模式,適用於小型應用程序。 PageController的目的是處理來自用戶界面的輸入。如果你希望這是一個單一的命令,那沒關係。你可以做

class PostAddController implements RequestHandler { 
    public function handle($request) { 
     $post = filter_input(INPUT_POST, 'post', FILTER_SANITIZE_SPECIAL_CHARS); 
     $model = new PostAddTransactionScript; 
     $model->process($post); 
     include 'postAddViewScript.php'; 
    } 
} 

PostAddTransactionScript然後將$ postData寫入數據庫或任何它應該做的事情。上面的簡化示例仍然與MVC一致,因爲它將事務腳本中的模型邏輯和表示層內的輸入處理保持在一起。

是否將輸入處理邏輯組織爲一個Controller類或許多較小的命令由您決定。分組職責更有意義,特別是如果您需要在命令之間共享狀態或通用功能。

至於你的例子,我寧願使用Strategy Pattern,並讓Post_Parent使用命令而不是使用Parent的命令,例如,

$commander = new PostCommander; 
$commander->setStrategy(new PostAddCommand); 
$commander->handle($_POST); 

在任何情況下,我同意其他人,你的控制器應是薄和模型應該做的主要工作。

1

個人而言,我不認爲你描述的模式將有助於你從長遠來看。如果你的控制器已經有「成千上萬的代碼行」,你就會遇到一個封裝問題,並且爲每個操作創建一個類只是將你的問題轉移到另一個層。

你的控制器應。你已經通過寫你的文章來認識到這一點。一個控制器應該協調你的視圖和你的模型之間的交互。該模型是您的業務邏輯所在的地方,因此您的控制器應該只有足夠的邏輯來確保執行適當的驗證,調用正確的業務邏輯並在業務邏輯處理完成時返回正確的視圖。

+0

請問,你能告訴我在哪裏可以閱讀關於「一般問題的封裝」?說「封裝的一般問題」,你的意思是我應該進行更多的重構,並將多個方法放入分離的類中,以便在所有控制器中共享。 – Kirzilla 2010-09-21 10:10:41

+0

我建議閱讀以下兩個鏈接作爲入門教材:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)和http://en.wikipedia.org/wiki/Solid_(object-oriented_design )。然後,我會鼓勵你閱讀更多關於SOLID原則的內容:http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod – 2010-09-21 11:23:30

0

我建議備份一點,覺得爲什麼增長這麼多的控​​制器。也許你可以做一個重構,並將一些共享組件提取到單獨的模塊中?也許你的邏輯中有一些代碼應該放在你的模型或視圖中?你使用了一個好的模板系統嗎?

分裂控制器成小塊不會解決根本問題,只掃到地毯下。

+0

我使用Smarty作爲模板引擎。我的控制器的方法大多包含像$ data = $ model-> getItems()的字符串; $ smarty-> assign(「data」,$ data);而這段代碼真的壓抑了我...... :( – Kirzilla 2010-09-21 09:58:56

相關問題