对惯性响应和 json 响应使用相同的方法 Laravel Jetstream

Posted

技术标签:

【中文标题】对惯性响应和 json 响应使用相同的方法 Laravel Jetstream【英文标题】:Use same method for inertia response and json response Laravel Jetstream 【发布时间】:2022-01-19 21:06:33 【问题描述】:

我一直在使用 Laravel 支持的 API 和 VueJS 支持的前端,这两个单独的项目用于单页应用程序。现在我想用 Inertia.js 切换到 Laravel Jetstream,因为我可以在单个项目中创建 SPA。这是惯性如何工作的示例-

class UsersController extends Controller


    public function index()
    
        $users = User::active()
            ->orderByName()
            ->get(['id', 'name', 'email']);

        return Inertia::render('Users', [
            'users' => $users
        ]);
    

现在我们可以定义Route::get('users',['UserController::class','index']); 并获取用户列表到localhost:8000/users 并在网页中查看用户列表。

我的问题是,我可以在移动应用中使用相同的控制器和方法进行 API 响应吗?

我必须构建具有相同功能的 Web 应用程序和移动应用程序。对于 web,我需要惯性响应,对于移动应用程序,我需要 json 响应。为了在 Laravel 项目中显示用户列表,我可以使用上面的代码。但是,如何为移动应用程序返回与 JSON 相同的响应,例如 return response($users);?我可以在api.php 中创建 API 路由并制作单独的控制器或方法,或者为 API 或惯性响应添加条件,但我认为可能有更好的方法来使用相同的控制器和方法来处理惯性和 JSON 响应。

【问题讨论】:

【参考方案1】:

是的,您完全可以通过检查请求是否需要 json 响应来做到这一点。像这样的:

public function index()

    $users = User::active()
        ->orderByName()
        ->get(['id', 'name', 'email']);

    if (request()->wantsJson()) 
        return $users;
    

    return Inertia::render('Users', [
        'users' => $users
    ]);

【讨论】:

我确实会选择 expectsJson() 而不是 wantsJson() 来处理 ajax 请求 是的,我们可以做到这一点。但是我们需要为每个方法有条件地返回两个响应。如果我们可以在一个地方进行一些配置,并且所有响应都自动处理,无论是惯性响应还是json响应,那就更好了。

以上是关于对惯性响应和 json 响应使用相同的方法 Laravel Jetstream的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 PYTHON 为 SQL INSERT FROM OPENJSON 转义 JSON 响应中的字符

使用 JMeter 比较多个 JSON 响应

处理和响应JSON数据

@ResponseBody 响应 json 数据

iOS和使用Json进行请求/响应的消费WCF服务方法

Spring 4 mvc REST XML 和 JSON 响应