Разработка уровня API.Нужны советы и отзывы об использовании шаблона Decorator - PullRequest
1 голос
/ 15 октября 2010

Я разрабатываю слой 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 Ответ

2 голосов
/ 16 октября 2010

На мой взгляд ... я думаю, что старой классической MVC будет достаточно ..

Ответ от команд API, возможно, должен быть отформатирован в другом форматы (JSON, XML и т. д.)

Контроллер считывает запрос и изменяет представление для вывода информации в выбранном формате. Или вы можете передать запрос представлению, и представление изменит формат вывода.

Для некоторых команд API может потребоваться аутентификация, для некоторых - нет

Это также задача для контроллера, чтобы прочитать и проверить запрос. Если пользователь не аутентифицирован, он изменит ответ

Каждая команда API должна быть открыта для расширения через плагины (уведомление о событиях, фильтрация параметров ввода / вывода и т. Д.)

Теперь это сложная часть ... вы можете изменить контроллер и реализовать шаблон стратегии. Это хорошая идея, если вы планируете постоянно менять свои плагины.

В моем случае у меня есть несколько контроллеров, и я использую фабрику контроллеров, которая читает запрос и возвращает контроллер, который управляет этим запросом.

Я не совсем уверен, как вы хотите реализовать свои плагины. Когда вы говорите Notification on events, мне кажется, что вы можете использовать шаблон наблюдателя, а filtering of input/output paramters кажется задачей контроллера.

Надеюсь, это поможет. Удачи

...