2012-03-13 48 views
5

我正在爲使用Symfony2的公司開發一個小型CMS。我非常喜歡這個框架。我喜歡錶單類並重用它們(畢竟這是關於表單的)。Symfony2並在控制器中成爲DRY方法

但是(是的,有一個「但」)我感覺我正在做同樣的東西,複製和粘貼在所有控制器。我們討厭的代碼重複。與所有的業務邏輯轉移到Services和形式,事件,教義堅持的行動,我的所有控制器都做同樣的事情:

  • 獲取程序存儲庫$this->get('mycompany.repository.entity')
  • 動態創建的形式(邏輯是表單內類本身)
  • 驗證表單,返回視圖或持久的實體
  • 等等...

我的意思是,控制器的動作都是一樣的,只是幾個字符的變化。

在我的控制器中如何能DRY與Symfony2?也許控制器作爲服務(我幾天前才發現的一個概念)可能會有所幫助?

編輯:相關的問題(由噓建議的第一個想法):Symfony2 how to redirect to an action without hardcoding route name?

回答

2

有很多方法可以得到一個更DRY的代碼庫:

  1. 你可以創建一個抽象BaseController 。它可以將重複使用的代碼分組到一些私有方法中,因此每個擴展它的控制器都可以使用它。使用私有屬性可以在調用方法之前設置控制器特定的內容。
  2. 您可以實現一些BaseService,因此您只需調用此服務,設置一些參數(如使用哪個存儲庫),然後讓服務執行邏輯
  3. 您可以只有一個控制器接受一些參數並定義每個路由使用這個控制器,傳遞特定的參數。

我想在想這件事的時候還有更多的方法。

我覺得想法1非常優雅,而3也有一些優勢。第二種方法是盲目的,特別是當你再次需要公開的代碼時(即使它會少得多,它遠不是最優的)。想法1與OO理念同步,並且它傳達了它的意圖。總結起來,我會使用一個BaseController!

+0

您認爲第1點就像是戰略模式嗎?我的意思是檢索 - 驗證 - 堅持? – gremo 2012-03-14 11:50:54

+0

我遵循你的第一個想法。這不是那麼簡單,看看我的相關問題:http://stackoverflow.com/questions/9719686/symfony2-how-to-redirect-to-an-action – gremo 2012-03-15 12:29:13

相關問題