[Из песочницы] Шаблон программирования CSN-Ajax

Идея очень проста, но дает значительные преимущества, по сравнению с кодом без применения данного шаблона, имеет потенциал активно применяться. Странно, но я не встречал ничего подобного в любом трендовом коде для повторного использования, поэтому назвал шаблон «CSN-Ajax» исходя из названия сайта и проекта «SKY Framewok», в котором шаблон впервые появился — CoreSky.Net, в моем проекте. Пример реализации я опишу здесь на основе применения PHP, jQuery и MVC паттерна. Итак, кратко, без комментариев:

1. Делаем в javascript функцию-обертку с именем ajax (action, postfields, func, controller) для $.post (…). Типичный вызов в коде приложения:
ajax('edit', post_vars, function(data) {
  // ....
})

2. Кроме «оборачивания» кода jQuery $.post (…), функция делает еще кое-что. Параметр controller в коде приложения часто пропущен, как в примере выше, его функция берет из «document.location.href», в общем случае распарсивая его значение, но часто это просто первый ключ строки запроса (query string, GET запроса). Т.е. если controller не указан, то запрос надо отослать «на свой» котроллер, это частый случай.

3. Считаем что веб приложение имеет единую точку входа, как часто и есть. Функция ajax (…) конструирует GET часть запроса сформировав «controller» и еще добавляет первым ключем-значением »__AJAX__=_»

4. В index.php, вначале файла написан такой код:


Т.е. если была использована функция на javascript ajax (…), бекенд «знает», что происходит ajax запрос, фреймворк это учитывает в своей работе, что сокращает код приложения и упрощает работу с ним. А, именно: это дает возможность, по умолчанию отключить layout и style приложения, что соответствует наиболее частому случаю. В то время, как для обычных запросов, фреймворк подключает по умолчанию некоторые layout и style.

5. Подразумеваем, что фреймворк подменил error handler php с помощью функции PHP set_error_handler (…), аналогично можно работать с Exception. В случае ошибок при запросах AJAX, бекенд, вместо требуемого вывода в браузер, выдает JSON данные, где добавляется ключ «catch_error», например:

echo json_encode(['catch_error' => "$this->errors

Stdout

" . html($stdout)]);

Конечно, подмена вывода в браузер возможна, когда используется буферизация STDOUT с помощью функции PHP ob_start (). Если функция ajax (…), детектировала, что имеются JSON данные с ключом «catch_error», она показывает, например, всплывающее окно с ошибками. Естественно, режим с ошибками должен работать только в режиме отладки приложения.

Реализация описанного выше шаблона CSN-Ajax, может варьироваться по-разному, но в общем преимущества, которые можно получить:

а) Более короткий синтаксис ajax вызовов на javascript, привязка к контроллеру относительная к открытой странице.
б) Более короткий синтаксис обработки ajax вызовов в контроллерах, не нужно специально отключать layout.
в) Имеется автоматическая нотификация разработчика об ошибках при запросах ajax.

Вообще, одна из задач хорошего Framework, — работать как архиватор, часто используемый код, должен представляться коротким синтаксисом, что прекрасно отражено в вышеописанном шаблоне.

Спасибо за внимание!

Комментарии (4)

  • 29 сентября 2016 в 12:25

    +1

    Данный код:
    if ('__AJAX__' == key($_GET)) {
      define('AJAX', true);
      array_shift($_GET);
    } else {
      define('AJAX', false);
    }
    

    меняем на:

    define( 'AJAX', ( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) AND ! empty( $_SERVER['HTTP_X_REQUESTED_WITH'] ) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) );
    
    • 29 сентября 2016 в 13:30

      0

      Спасибо, большое за уточнение, и вариацию реализации серверного кода
  • 29 сентября 2016 в 12:29

    0

    почему мне кажется, что я вижу какойто костыль?
    HTTP_X_REQUESTED_WITH для слабаков?
    современные фреймворки позволяют формировать респонс в зависимости от того аякс/не аякс ли это, да еще и опирась не заголовки Accept чтобы засериализироват ьв требуемый формат
    • 29 сентября 2016 в 13:36

      0

      А как насчет, чтобы показать ошибки backend? Я согласен что использовать HTTP_X_REQUESTED_WITH это технологично, но описываемая логика при этом не меняется.

© Habrahabr.ru