Laravel angularjs Request::ajax() always false
When doing AJAX calls, the X-Requested-With
header is often set to XMLHttpRequest
. Laravel's Request::ajax()
method is built on top of a Symfony2 method that simply checks for the presence of this header.
In October 2012, Angular.js removed this header because they felt that it was rarely used.
As @Thrustmaster and yourself mentioned in the comments, you need to set:
$httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"
If you'd rather not modify the front-end angular application (or can't), and would rather modify your Laravel code to differentiate between Angular JS AJAX requests vs. other requests, you can also use Request::wantsJson()
:
if(Request::wantsJson()) { // Client wants JSON returned } else { // Client does not want JSON returned}
The wantsJson
method relies on the standard Accepts
HTTP header (rather than the non-standard X-Requested-With
header) for the presence of application/json
. As long as Angular JS leaves that in by default and you don't remove it on purpose, this method should be reliable.
For AngularJs newbies looking for where to add $httpProvider.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest"
Here is an example:
var angularApp = angular .module('angularApp', [ 'ngResource', ]) .config(['$httpProvider', function($httpProvider) { $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest'; }]);