2010-10-15 67 views
1

我正在爲我的應用程序開發api層。我設計了一個結構,需要一些建議/反饋。你可以在底部找到結構的基本實現。開發一個API層。需要關於Decorator模式使用的一些建議和反饋

這裏是我的結構要求:(JSON,XML等)

  • 從API命令的響應可能需要以不同的格式進行格式化
  • 一些API命令可能需要進行身份驗證,有的可能不
  • 每個API命令應該是開放的,以通過插件擴展(通知關於事件,輸入/輸出paramters的濾波等)

考慮到這些要求我已將Decorator模式應用於我的API層。我不確定我是否設計了正確的結構,需要確定。

需求列表中的最後一項未在下面的實現中討論,因爲我仍在試圖找出如何做到這一點。

您認爲如何?我在正確的道路上嗎?

<?php 

// Interfaces 
interface I_API_Command {} 

// Abstract classes 
abstract class A_API_Command implements I_API_Command 
{ 
    abstract public function run(); 
} 

abstract class A_Decorator_API_Command implements I_API_Command 
{ 
    protected $_apiCommand; 
    public function __construct(I_API_Command $apiCommand) { 
     $this->_apiCommand = $apiCommand; 
    } 
    abstract public function run(); 
} 

// Api command class 
class APIC_Tasks_Get extends A_API_Command 
{ 
    public function run() { 
     // Returns tasks 
    } 
} 

// Api command decorator classes 
class APICD_Auth extends A_Decorator_API_Command 
{ 
    public function run() { 
     // Check authentication 
     // If not authenticated: return error 

     // If authenticated: 
     return $this->_apiCommand->run() 
    } 
} 

class APICD_JSON_Formatter extends A_Decorator_API_Command 
{ 
    public function run() { 
     return json_encode($this->_apiCommand->run()); 
    } 
} 

// Usage 
$apiCommand = new APICD_JSON_Formatter(new APICD_Auth(new APIC_Tasks_Get())); 
$apiCommand->run(); 

?> 
+1

現在我在想,也許我應該實施戰略模式,而不是裝飾模式。因爲我想選擇不同的輸出格式策略,所以不要將輸出格式策略層疊在一起。也許戰略模式輸出格式和裝飾模式認證。天啊!? – matte 2010-10-15 10:31:45

回答

2

在我看來...我認爲,舊的經典MVC就足夠了..

從API命令的響應可能需要在不同的 格式(JSON,XML等進行格式化)

控制器將讀取請求並更改視圖以輸出所選格式的信息。或者您可以將請求傳遞給視圖,視圖會更改輸出格式。

一些API命令可能需要進行身份驗證,有些人可能不

這也爲控制器的任務,讀取和驗證請求。如果用戶沒有被認證它會改變響應

每個API命令應該是開放的,以通過插件擴展(有關事件的通知,輸入/輸出paramters的濾波等)

現在這是棘手的部分..你可以修改控制器並實施戰略模式。如果你打算不斷改變你的插件,這是一個好主意。

在我的情況下,我有多個控制器,我使用Controller Factory來讀取請求並返回一個管理該請求的控制器。

我不太清楚你想如何實現你的插件。當你說Notification on events聽起來我可以使用觀察者模式,並且filtering of input/output paramters看起來像是一個控制器的任務。

我希望這會有所幫助。好運

+0

如果我錯了,請糾正我。你的建議是,對於每個API命令,我需要一個控制器。例如;對於API命令類APIC_Tasks_Get,我需要一個控制器來調用該命令,如果需要檢查auth並根據請求類型返回正確的視圖? – matte 2010-10-16 10:19:39

+1

mmm你可以爲每個命令設置一個控制器..但是你可能會得到很多控制器......想法是將你的api命令分組在幾個控制器上。在你的例子中:我有一個類APIC_Task_Controller,它管理APIC_Tasks_Get,APIC_Tasks_Set,APIC_Tasks_Describe等。 – pleasedontbelong 2010-10-16 10:46:05

+0

好主意,謝謝! – matte 2010-10-16 12:43:30

相關問題