在控制器内的 laravel view() 函数中,这可以检测到 AJAX 请求吗
In laravel view() function within a controller, can this detect an AJAX request
在我的控制器中,我有如下内容:
public function index()
{
$questions = Question::all();
return view('questions.index', compact('questions'));
}
但是,我希望我的 ajax 请求也使用这条路线。在这种情况下,我想 return JSON。我正在考虑以下事项:
public function index()
{
$questions = Question::all();
return $this->render('questions.index', compact('questions'));
}
public function render($params)
{
if ($this->isAjax()) {
return Response::json($params);
} else {
return view('questions.index')->with($params);
}
}
..顺便说一句,我还没有测试过这些,但希望你明白了。
但是,我想知道我是否可以改变内置的 view(...) 功能本身来使事情变得更轻。所以我只保留以下内容:
public function index()
{
$questions = Question::all();
// this function will detect the request and deal with it
// e.g. if header X-Requested-With=XMLHttpRequest/ isAjax()
return view('questions.index', compact('questions'));
}
这可能吗?
使用Request::ajax()
,或者注入请求对象:
use Illuminate\Http\Request;
class Controller {
public function index(Request $request)
{
$data = ['questions' => Question::all()];
if ($request->ajax()) {
return response()->json($data);
} else {
return view('questions.index')->with($data);
}
}
}
您的视图永远不会知道有关 HTTP 的任何信息request/response。
您可能想要自定义回复:
- 添加ResponseServiceProvider.php
namespace App\Providers;
use Request;
use Response;
use View;
use Illuminate\Support\ServiceProvider;
class ResponseServiceProvider extends ServiceProvider
{
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
Response::macro('smart', function($view, $data) {
if (Request::ajax()) {
return Response::json($data);
} else {
return View::make($view, $data);
}
});
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
- 将 'App\Providers\ResponseServiceProvider' 添加到
config/app.php
中的提供商列表:
'providers' => [
'App\Providers\ResponseMacroServiceProvider',
];
- 在控制器中使用新助手:
return Response::smart('questions.index', $data);
我想最简单的方法就是在父Controller中放一个方法class:
use Illuminate\Routing\Controller as BaseController;
abstract class Controller extends BaseController {
...
protected function render($view, $data)
{
if (Request::ajax()) {
return Response::json($data);
} else {
return view($view, $data);
}
}
}
然后不执行 view('questions.index, $data);
,而是执行 $this->render('questions.index', $data);
只需在您的索引方法本身中检查 Request 是否为 Ajax 请求。
public method index() {
$questions = Question::all();
if(\Request::ajax())
return \Response::json($questions);
else
return view('questions.index', compact('questions'));
}
在我的控制器中,我有如下内容:
public function index()
{
$questions = Question::all();
return view('questions.index', compact('questions'));
}
但是,我希望我的 ajax 请求也使用这条路线。在这种情况下,我想 return JSON。我正在考虑以下事项:
public function index()
{
$questions = Question::all();
return $this->render('questions.index', compact('questions'));
}
public function render($params)
{
if ($this->isAjax()) {
return Response::json($params);
} else {
return view('questions.index')->with($params);
}
}
..顺便说一句,我还没有测试过这些,但希望你明白了。
但是,我想知道我是否可以改变内置的 view(...) 功能本身来使事情变得更轻。所以我只保留以下内容:
public function index()
{
$questions = Question::all();
// this function will detect the request and deal with it
// e.g. if header X-Requested-With=XMLHttpRequest/ isAjax()
return view('questions.index', compact('questions'));
}
这可能吗?
使用Request::ajax()
,或者注入请求对象:
use Illuminate\Http\Request;
class Controller {
public function index(Request $request)
{
$data = ['questions' => Question::all()];
if ($request->ajax()) {
return response()->json($data);
} else {
return view('questions.index')->with($data);
}
}
}
您的视图永远不会知道有关 HTTP 的任何信息request/response。
您可能想要自定义回复:
- 添加ResponseServiceProvider.php
namespace App\Providers;
use Request;
use Response;
use View;
use Illuminate\Support\ServiceProvider;
class ResponseServiceProvider extends ServiceProvider
{
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
Response::macro('smart', function($view, $data) {
if (Request::ajax()) {
return Response::json($data);
} else {
return View::make($view, $data);
}
});
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
- 将 'App\Providers\ResponseServiceProvider' 添加到
config/app.php
中的提供商列表:
'providers' => [
'App\Providers\ResponseMacroServiceProvider',
];
- 在控制器中使用新助手:
return Response::smart('questions.index', $data);
我想最简单的方法就是在父Controller中放一个方法class:
use Illuminate\Routing\Controller as BaseController;
abstract class Controller extends BaseController {
...
protected function render($view, $data)
{
if (Request::ajax()) {
return Response::json($data);
} else {
return view($view, $data);
}
}
}
然后不执行 view('questions.index, $data);
,而是执行 $this->render('questions.index', $data);
只需在您的索引方法本身中检查 Request 是否为 Ajax 请求。
public method index() {
$questions = Question::all();
if(\Request::ajax())
return \Response::json($questions);
else
return view('questions.index', compact('questions'));
}