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()
)
Ответы
Ответ 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';
}]);