Подтвердить что ты не робот

Laravel angularjs Request:: ajax() всегда false

Я создаю приложение с angularjs и laravel 4. Все в порядке, но теперь мне нужно разрешить только запросы XHR.

Это то, что у меня есть в начале моего контроллера. Но это утверждение всегда неверно.

    if (!\Request::ajax())
    {
        return Response::json(array('halt'=>Request::ajax()));
    };

В angular Я использую стандартную службу $http.

angular.module('APP')
.factory("API", ($http,$q,appClient,apiURL) ->
 class FB
  constructor:->
    this.deferredData = $q.defer();
  info: (reload)->
    $http(
      method: "get"
      url: apiURL+'game/'+appClient+"/info"
    ).success((res)->
      dostuff()
    )
4b9b3361

Ответ 1

При выполнении вызовов AJAX заголовок X-Requested-With часто устанавливается на XMLHttpRequest. Метод Laravel Request::ajax() построен поверх метода Symfony2, который просто проверяет наличие этого заголовка.

В октябре 2012 года Angular.js удалил этот заголовок, потому что чувствовал, что он редко используется.

Как @Thrustmaster и вы упомянули в комментариях, вам нужно установить:

$httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"

Ответ 2

Если вы предпочитаете не модифицировать внешнее приложение angular (или не можете) и скорее измените свой код Laravel, чтобы различать запросы angular JS AJAX и другие запросы, вы также можете использовать Request::wantsJson():

if(Request::wantsJson()) {
    // Client wants JSON returned 
} else {
    // Client does not want JSON returned
}

Метод wantsJson основан на стандартном Accepts HTTP-заголовке (а не на нестандартном X-Requested-With заголовке) на наличие application/json. Пока angular JS оставляет это по умолчанию, и вы не удаляете его специально, этот метод должен быть надежным.

Ответ 3

Для новичков AngularJs ищет, где добавить $httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"

Вот пример:

var angularApp = angular
  .module('angularApp', [
    'ngResource',
  ])
  .config(['$httpProvider', function($httpProvider) {
      $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
  }]);