Reputation: 9024
I have been trying to find a way to determine Ajax calls in Laravel but I have not found any documentation about it.
I have an index()
controller function where I want to handle the response differently based on the nature of the request. Basically this is a resource controller method that is bound to GET request.
public function index()
{
if(!$this->isLogin())
return Redirect::to('login');
if(isAjax()) // This is what I am needing.
{
return $JSON;
}
$data = array(
'records' => $this->table->fetchAll()
);
$this->setLayout(compact('data'));
}
I know the other methods of determining the Ajax request in PHP but I want something specific to Laravel.
Thanks
Updated:
I tried using
if(Request::ajax())
{
echo 'Ajax';
}
But I am receiving this error:
Non-static method Illuminate\Http\Request::ajax() should not be called statically, assuming $this from incompatible context
The class shows that this is not a static method.
Upvotes: 129
Views: 197087
Reputation: 427
Do something like this
public function functionName(User $user): string
{
(string) $message = "";
// check if request is ajax
if(request()->ajax())
{
if($this->isOwner($user->id)){
$message = 'success';
}else{
$message = "You are unauthorized to perform this action.";
}
}else{
$message = 'Wrong server request';
}
return $message;
}
Upvotes: 1
Reputation: 1276
Most of the answers are working fine. We can also check the request header
request()->header('Accept')=='application/json'
to check the request type
Upvotes: -1
Reputation: 8088
You can try $request->wantsJson()
if $request->ajax()
does not work
$request->ajax()
works if your JavaScript library sets an X-Requested-With HTTP header.
By default Laravel set this header in js/bootstrap.js
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
In my case, I used a different frontend code and I had to put this header manually for $request->ajax()
to work.
But $request->wantsJson()
will check the axios query without the need for a header X-Requested-With
:
// Determine if the current request is asking for JSON. This checks Content-Type equals application/json.
$request->wantsJson()
// or
\Request::wantsJson() // not \Illuminate\Http\Request
Upvotes: 33
Reputation: 894
Those who prefer to use laravel helpers they can check if a request is ajax using laravel request()
helper.
if(request()->ajax())
// code
Upvotes: 7
Reputation: 5358
Sometimes Request::ajax()
doesn't work, then use \Request::ajax()
Upvotes: 3
Reputation: 27311
For those working with AngularJS front-end, it does not use the Ajax header laravel is expecting. (Read more)
Use Request::wantsJson() for AngularJS:
if(Request::wantsJson()) {
// Client wants JSON returned
}
Upvotes: 8
Reputation: 1
after writing the jquery code perform this validation in your route or in controller.
$.ajax({
url: "/id/edit",
data:
name:name,
method:'get',
success:function(data){
console.log(data);}
});
Route::get('/', function(){
if(Request::ajax()){
return 'it's ajax request';}
});
Upvotes: 0
Reputation: 1322
To check an ajax request you can use if (Request::ajax())
Note: If you are using laravel 5, then in the controller replace
use Illuminate\Http\Request;
with
use Request;
I hope it'll work.
Upvotes: 23
Reputation: 152890
You are using the wrong Request
class. If you want to use the Facade like: Request::ajax()
you have to import this class:
use Illuminate\Support\Facades\Request;
And not Illumiante\Http\Request
Another solution would be injecting an instance of the real request class:
public function index(Request $request){
if($request->ajax()){
return "AJAX";
}
(Now here you have to import Illuminate\Http\Request
)
Upvotes: 24
Reputation: 2843
Maybe this helps. You have to refer the @param
/**
* Display a listing of the resource.
*
* @param Illuminate\Http\Request $request
* @return Response
*/
public function index(Request $request)
{
if($request->ajax()){
return "AJAX";
}
return "HTTP";
}
Upvotes: 247
Reputation:
public function index()
{
if(!$this->isLogin())
return Redirect::to('login');
if(Request::ajax()) // This is check ajax request
{
return $JSON;
}
$data = array();
$data['records'] = $this->table->fetchAll();
$this->setLayout(compact('data'));
}
Upvotes: 4
Reputation: 351
if(Request::ajax())
Looks to be the right answer. http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax
Upvotes: 12