Стандартная практика для вывода страницы запроса ajax?

#php #ajax #coding-style

#php #ajax #стиль кодирования

Вопрос:

Какова стандартная практика со страницами PHP, которые используются для запросов Ajax? Должны ли они выводить единственное значение (например: получать очки игрока с id = x)? Обслуживает ли / должна ли одна страница обслуживать несколько запросов? Если да, то как можно сгруппировать код на стороне PHP?

P.S: Дополнительный вопрос: Если используется система шаблонов, подобная Smarty, было бы интереснее с точки зрения безопасности вызывать используемую страницу PHP вместо прямого вызова страницы запроса?

Комментарии:

1. Не могли бы вы подробнее остановиться на секретном вопросе? В чем разница между используемой страницей php или страницей запроса напрямую? По моему мнению, вы всегда будете вызывать страницу smarty через php, верно? Чего я не понимаю?

2. @Arend: Конечно. Пример. У меня есть некоторый javascript, который вызывает страницу, которая начисляет баллы пользователям в зависимости от того, как долго они были подключены к сайту. На данный момент название страницы отображается в исходном html-файле, а также имена переменных POST, включая идентификатор пользователя (возможность подделки). Если вместо этого я вызову базовую страницу PHP (somepage.tpl: javascript->somepage.php ) часть информации может быть неявной, и информация может быть перенаправлена на другую страницу через PHP.

3. Хорошо, я думаю, что я понял это, но только частично. В общем случае вам не нужно указывать user_id в переменных post, потому что вы можете получить эту информацию из сеансов. В остальном обычно не должно иметь большого значения, сколько люди могут видеть, пока вы проверяете учетные данные / разрешения пользователей в php.

Ответ №1:

Я думаю, имеет смысл создавать массивы на php, затем преобразовывать их в JSON и отправлять обратно в виде объекта JSON. Это позволяет более гибко манипулировать данными как на стороне сервера, так и на стороне клиента.

Комментарии:

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

2. Я не рассматривал этот подход. Есть ли у вас объекты JSON, соответствующие один в один объектам PHP?

3. @James да, вы реплицируете те же структуры данных, которые используете в качестве объектов JSON в php, используя массивы.

Ответ №2:

Я использую этот фрагмент кода в Javascript. Все, что связано с серверной частью, организовано по типу организации MVC, поэтому вещи, влияющие на один модуль, обычно группируются вместе. В общем, я также создаю модуль sperate для отдельной модели, но в некоторых случаях вы можете отклониться от этого принципа.

PHP

Выполните фрагмент кода и оберните его в блок try / catch. Таким образом сообщения об ошибках могут передаваться во внешний интерфейс. Этот метод помогает в этом отношении преобразовать исключения в читаемую ошибку. (для отладки из json).

 try {
    //... execute code ..  go about your buisness..
    $this->result = "Moved  " . count($files) . " files ";
    // result can be anything that can be serialized by json_encode()
} catch (Exception $e) {
   $this->error = $e->getMessage() . ' l: '  . $e->getLine() . ' f:' . $e->getFile();
   // return an error message if there is an exception. Also throw exceptions yourself to make your life easier.
}
// json response basically does something like echo json_encode(array("error" => $this->error, "result" => $this->result))
return $this->jsonResponse();
  

Для обработки ошибок я часто использую это для разбора ошибок.

 public function parseException($e) {
    $result = 'Exception: "';
    $result .= $e->getMessage();
    $trace = $e->getTrace();
    foreach (range(0, 10) as $i) {
        $result .= '" @ ';
        if (!isset($trace[$i])) {
            break;
        }
        if (isset($trace[$i]['class'])) {
            $result .= $trace[$i]['class'];
            $result .= '->';
        }
        $result .= $trace[$i]['function'];
        $result .= '(); ';
        $result .= $e->getFile() . ':' . $e->getLine() . "nn";
    }

    return $result;
}
  

Сторона Javascript

 /**
 * doRequest in an ajax development tool to quickly execute data posts.
 * @requires jQuery.log
 * @param action (string): url for the action to be called. in config.action the prefix for the url can be set
 * @param data (object): data to be send. eg. {'id':5, 'attr':'value'}
 * @param successCallback (function): callback function to be executed when response is success
 * @param errorCallback (function): callback function to be executed when response is success
 */
jQuery.doRequest = function (action, data, successCallback, errorCallback) {
    if (typeof(successCallback) == "undefined") {
        successCallback = function(){};
    } 
    if (typeof(errorCallback) == "undefined") {
        errorCallback = function(data ){
            alert(data.error);
        };
    }
    jQuery.log(action);

    jQuery.post(action, data, function (data, status)
    {

        jQuery.log(data);
        jQuery.log(status);
        if (data.error !== null || status != 'success') {
            // error handler
            errorCallback(data);
        } else {
            successCallback(data);
        }
    },'json');
};
  

Примечание: обратные вызовы с ошибками очень хороши, если вы объедините их с чем-то вроде pNotify