Мысли

Паттерн «Веб-функция»

2012.06.07

Допустим, вам нужно написать endpoint для аякс-запроса. Или обычный обработчик обычного POST-запроса от веб-формы. Тогда основные действия, которые обязательно должны быть в процессе обработки, будут такие:

  • Фильтрация входных данных (это НЕ валидация бизнес-правилами, только лишь такие действия, как укорачивание, очистка от окружающих пробелов, исключение непечатных символов, приведение к нижнему регистру и т. д.). Или мы можем даже сыграть роль адаптера и переименовать некоторые параметры запроса в вид, ожидаемый обработчиком.
  • Обработка запроса. Здесь мы собственно делаем то, зачем существуем. Мы ожидаем уже более-менее очищенный от мусора массив входных параметров, возможно, среди которых есть ошибочные (например, числовое значение вне допустимого диапазона, или передан массив вместо скаляра).
  • Форматирование результата для отклика клиенту. Например, мы можем возвращать JSON, или генерировать HTML страницу по шаблону. Или генерировать изображения. Или отдавать файлы с диска.

Если записать в функциональном стиле на PHP, то можно получить следующий шаблон хэндлера:

<?php

echo format(process(clean($_REQUEST)));

/**
  * Здесь очистка суперглобального массива $_REQUEST и генерация массива $request
  *
  * @param array $request Данные запроса из массива $_POST или $_GET (или $_REQUEST).
  * @return array Очищенные данные из запроса, которые ожидает функция process.
  */
function clean($request)
{
  // TODO
  return $request;
}

/**
  * Здесь выполнение действий согласно запросу $request
  *
  * @param array $request Параметры запроса, очищенные функцией clean.
  * @return array $result Результат работы со всей информацией, необходимой для форматирования ответа клиенту.
  */
function process($request)
{
  // TODO
  return $request;
}

/**
  * Здесь форматирование результата работы для выдачи клиенту.
  *
  * @param array $result Результат работы, как он сгенерирован процессором. Нам не дозволяется использовать какие-либо другие данные.
  * @return string Форматированный ответ, готовый к отправке клиенту через echo.
  */
function format($result)
{
  // TODO
  return json_encode($result);
}
?>

Если process сталкивается с ошибкой, он пишет об этом в результат своей работы (например, в поле 'error') и сразу возвращает результат в format.

Если format должен генерировать большой HTML документ, то ничего страшного, он может и делать echo внутри себя, вместо того, чтобы возвращать строку. Тогда вызов всей цепочки будет без echo в начале, конечно же.

Предыдущий: Рефакторинг заданий курса КГУ по программированию 2004-2011 гг Следующий: Простое и сложное в Common Lisp