Паттерн «Веб-функция»
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 в начале,
конечно же.