6

人們如何設計其服務層接口?我正在編程一個大型Web應用程序(使用PHP),我們正在使用MVC和編程瘦控制器,例如, (僞代碼如下)應用程序服務層 - 如何編寫API方法接口

public savePersonAction() { 
    $input = filter($_GET); 
    ... input validation ... 

    $result = $this->_service->savePerson(?); 

    ... etc 
} 

是否應savePerson在服務採取整個$輸入結構或上下文的參數(在PHP,關聯數組)?

E.g.這 -

public function savePerson(array $input) { 

或應該分離出所有的輸入字段,並提供一個「硬」的接口,例如,

public function savePerson($title, $firstName, $lastName, $dateOfBirth, ... etc.. for many more) { 

謝謝。

保羅

+0

真棒問題,保羅! – mkoistinen 2010-11-04 01:35:51

回答

5

如果您要遵循MVC精神,您的savePerson方法不應接受原始輸入。它不應該直接與來自ui的數據格式相結合。相反,它應該接受服務領域中定義的輸入,如「人」對象。 (這可能只是像Cobby建議的關聯數組)。將原始輸入映射爲服務所需格式將是控制器操作方法的工作。

這個額外的翻譯步驟的好處是,它將您的服務(模型)與用戶界面隔離開來。如果你實現了一個不同的UI,你不需要改變服務接口。你只需要編寫新的控制器(當然還有視圖)。

雖然你的例子像savePerson($title, $firstName, $lastName...)是正確的想法,但是當你有超過2或3個參數的方法時,它通常是一個不好的跡象。您應該能夠將相關參數分組到某種更高級別的對象中。

+0

感謝dellsala(和Cobby)在閱讀並思考它之後,參數「原子」聽起來是最好的方式(我在這裏使用Apache OFBiz項目作爲研究材料)。 – 2010-11-11 09:10:00

1

我的MVC應用程序的結構是這樣的: 控制器 - >服務 - > ORM /其他圖書館

要回答你的問題,通常在你的控制器,你會得到表單數據作爲一個數組,即$ form-> getValues()或類似的東西。在可維護性方面,如果您的服務除了數組作爲參數,最好是這樣,如果您向表單添加另一個字段,則只需更新表單和服務,您的控制器可以保持不變,並且仍然可以工作。

因此,我認爲你的第一個例子中去:

public function savePerson($personArray); 

此外,你不應該需要一個「硬」界面,因爲你的表單庫會照顧驗證/ filteration /消毒的,所以我們可以假設關聯數組將是有效的,並且方法定義將隨命名參數變得很長。

+0

將是一種可行的方式來傳遞表單對象呢? – JCM 2011-09-19 19:34:41

+0

你的意思是表格中的數據?我沒有跟隨你的問題喬納森。 – Cobby 2011-09-20 03:46:52

+0

'$ myForm = new My \ Form; if($ myForm-> isValid($ request-> getPost())){$ myService-> doThings($ myForm);}' – JCM 2011-09-21 19:18:59

0

我會分離出所有的輸入字段,並在服務中提供一個「硬」接口。

public function savePerson($title, $firstName, $lastName, $dateOfBirth) {...} 

它更乾淨,沒有任何必要的假設。

相關問題