Yii Framework 2.0 проверяет, является ли запрос GET от AJAX

Работая с Yii framework 2.0, у меня есть сценарий AJAX GET jQuery, который указывает на функцию в классе контроллера.

$.get('localhost/website/index', {param: 'xxxx'}, function(returnedData){
    // some code here.....
}, 'json');

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

public function actionIndex() {
     $getParam = $_GET['param'];
     // echo $getParam is: 'xxxx'.

     // some other code here....

     echo json_encode(array());
}

Все работает нормально при выполнении этого скрипта AJAX GET jQuery. Но если я перехожу по ссылке localhost/website/index вручную в веб-браузере, я получаю следующую ошибку.

PHP Notice - ErrorException
Undefined index: param

// the code snippet is also being shown.....

Я не хочу, чтобы пользователи видели эту ошибку, если они знают эту ссылку и переходят по ней случайно или намеренно. Если я использую

if($_GET['param']){...}

Я все еще получаю сообщение об ошибке в браузере. Как я могу это решить?


person O Connor    schedule 13.10.2014    source источник
comment
Я не хочу, чтобы пользователи видели эту ошибку, если они знают эту ссылку и переходят по ней случайно или намеренно. - Почему? Вы не можете запретить пользователям видеть то, что вы отправляете в их браузер. Если необработанные данные не предназначены для непосредственного просмотра конечными пользователями, просто не поощряйте их смотреть на них. Они смогут это увидеть, если действительно захотят, а вы просто потратите свое время, пытаясь остановить их.   -  person Quentin    schedule 13.10.2014


Ответы (2)


Вы можете проверить, является ли запрос запросом ajax с помощью isAjax:

$request = Yii::$app->request;
if ($request->isAjax) {...}

Или вы можете проверить, что запрос POST или GET

if (Yii::$app->request->isPost) {...}
if (Yii::$app->request->isGet) {...}

И всегда используйте isset()! :)

person Adam Fentosi    schedule 16.10.2014
comment
могу ли я использовать пост ajax запрос и isPost одновременно? @АдамФентози - person Stfvns; 16.11.2015
comment
@Stfvns Я не тестировал, но не вижу в этом никаких проблем. XMLHttpRequest может быть либо POST, либо GET. - person Adam Fentosi; 18.11.2015

Простой способ:

if (isset($_GET['param'])) {
    ...
}

правильно:

if (isset($_SERVER['HTTP_X_REQUESTED_WITH'] 
    && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
) {
    //...
}
person mochalygin    schedule 13.10.2014
comment
Обратите внимание, что это зависит от добавления нестандартного заголовка x-requested-with (что не является проблемой при использовании jQuery, поскольку он добавляет его по умолчанию) и не обеспечивает никакой безопасности. На самом деле не стоит использовать это ни для чего, кроме решения, хотите ли вы вернуть JSON или HTML-документ для RESTful API. - person Quentin; 13.10.2014
comment
Извините, я не очень понимаю вашу точку зрения. Все, что мне нужно, это приведенный выше оператор if, чтобы скрыть сообщение об ошибке в веб-браузере, если пользователь посещает указанную выше ссылку, потому что он предназначен для запроса AJAX GET. - person O Connor; 13.10.2014
comment
При отправке AJAX-запроса веб-браузер автоматически добавляет заголовок $_SERVER['HTTP_X_REQUESTED_WITH'] == 'xmlhttprequest'. Если вы пытаетесь открыть страницу по URL-адресу -- браузер не добавляет такой заголовок. Итак, если условие $_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' равно true -- это AJAX-запрос, если false -- нет. - person mochalygin; 13.10.2014