2010-10-15 32 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

相关问题