开发API层。需要一些关于Decorator模式使用的建议和反馈

时间:2010-10-15 09:40:41

标签: php oop design-patterns decorator

我正在为我的应用程序开发一个api层。我设计了一个结构,需要一些建议/反馈。您可以在底部找到结构的基本实现。

以下是我对结构的要求:

  • API命令的响应可能需要格式化为不同的格式(JSON,XML等)
  • 某些API命令可能需要身份验证,有些可能不需要
  • 每个API命令都应该通过插件打开扩展(事件通知,输入/输出参数的过滤等)。

考虑到这些要求,我已将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 个答案:

答案 0 :(得分:2)

在我看来......我认为旧的经典MVC就够了......

  

API命令的响应可能需要以不同的格式进行格式化   格式(JSON,XML等)

控制器将读取请求并更改视图以输出所选格式的信息。或者您可以将请求传递给View,视图将更改输出格式。

  

某些API命令可能需要身份验证,有些可能不需要

这也是控制器的任务,用于读取和验证请求。如果用户未经过身份验证,则会更改响应

  

每个API命令都应该通过插件打开扩展(事件通知,输入/输出参数的过滤等)

现在这是棘手的部分..你可以修改控制器并实现策略模式。如果您计划不断更换插件,这是个好主意。

在我的情况下,我有多个控制器,我使用一个控制器工厂来读取请求并返回一个管理该请求的控制器。

我不确定你想如何实现你的插件。当你说Notification on events时,我觉得你可以使用观察者模式,filtering of input/output paramters似乎是控制者的任务。

我希望这会有所帮助。祝你好运