Laravel 5返回JSON或View取决于是否ajax

zeo*_*ega 9 php controller laravel laravel-5

我想知道是否有一种神奇的方法来使用这种情况:

如果我通过AJAX请求调用页面,控制器将返回一个JSON对象,否则它将返回一个视图,我试图在我的所有控制器上执行此操作而不更改每个方法.

例如,我知道我可以这样做:

if (Request::ajax()) return compact($object1, $object2);
else return view('template', compact($object, $object2));
Run Code Online (Sandbox Code Playgroud)

但我有很多控制器/方法,我更喜欢改变基本行为,而不是花时间改变所有这些.任何的想法 ?

rya*_*ter 6

最简单的方法是创建一个在所有控制器之间共享的方法.

例:

这是所有其他控制器扩展的控制器类:

<?php namespace App\Http\Controllers;

use Illuminate\Routing\Controller as BaseController;

abstract class Controller extends BaseController
{
    protected function makeResponse($template, $objects = [])
    {
        if (\Request::ajax()) {
            return json_encode($objects);
        }

        return view($template, $objects);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是扩展它的控制器之一:

<?php namespace App\Http\Controllers;

class MyController extends Controller
{
    public function index()
    {
        $object = new Object1;
        $object2 = new Object2;

        return $this->makeResponse($template, compact($object, $object2));
    }
}
Run Code Online (Sandbox Code Playgroud)

Laravel 5+的更新

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    protected function makeResponse($request, $template, $data = [])
    {
        if ($request->ajax()) {
            return response()->json($data);
        }

        return view($template, $data);
    }
}
Run Code Online (Sandbox Code Playgroud)
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class MyController extends Controller
{
    public function index(Request $request)
    {
        $object = new Object1;
        $object2 = new Object2;

        return $this->makeResponse($request, $template, compact($object, $object2));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @RuChernChong你可以.或者您可以使用`\ Request :: ajax()`,`\ Request :: expectedJson()`或`\ Request :: wantsJson()`,具体取决于您想要的. (2认同)