Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel angularjs Request::ajax() always false

I'm building application with angularjs and laravel 4. Everything is fine but I need now to allow only XHR requests.

This is what I have at the beginning of my controller. But this statement is always false.

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

In angular I'm using standard $http service.

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()     ) 
like image 378
zajca Avatar asked Dec 09 '13 16:12

zajca


People also ask

What is request -> ajax () in Laravel?

In Laravel, we can use $request->ajax() method to check request is ajax or not. Example: public function saveData(Request $request) { if($request->ajax()){ return "Request is of Ajax Type"; } return "Request is of Http type"; }

Does AngularJS use ajax?

Angular vs AJAXAngular is more general whereas AJAX is more specific. In other words, Angular is a big framework whereas AJAX is a JavaScript method that enables asynchronous communication between the database and the server. Angular uses AJAX technology to build single-page applications.

How does ajax call work in AngularJS?

The AngularJS provides a control service named as AJAX – $http, which serves the task for reading all the data that is available on the remote servers. The demand for the requirement of desired records gets met when the server makes the database call by using the browser. The data is mostly needed in JSON format.

Does Laravel support ajax?

The ajax request can be GET or POST or other valid types. To use AJAX in Laravel, you need to import a jquery library in your view file to use ajax functions of jquery, which will be used to send and receive data using ajax from the server.


2 Answers

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" 
like image 155
Moshe Katz Avatar answered Oct 07 '22 10:10

Moshe Katz


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.

like image 30
Jeff Lambert Avatar answered Oct 07 '22 11:10

Jeff Lambert