【问题标题】:Laravel error handling for APIsAPI 的 Laravel 错误处理
【发布时间】:2018-07-02 13:41:44
【问题描述】:


我正在使用 Laravel 5.5 构建一个 Web 应用程序 + REST 服务器,以便用户可以通过 Web 界面在线访问服务或通过移动应用程序间接使用 API。

现在的目标是让相同的控制器能够利用 Laravel 内置的双重路由和 FormRequests 的自动 JSON 响应来处理 API 和直接请求。
我想的主要问题是:

  1. 如何在同一个控制器函数上处理 JSON(用于 API 访问)和 HTML 视图(用于 Web 访问者)响应?
  2. 如何管理控制器中的“资源未找到”错误并随后以所需的方式回复用户?

解决第二个问题的一种可能方法是使用“findOrFail”,然后捕获异常,查看请求是否有“Accpet”标头并相应地回复,但它看起来相当庞大。

这是我正在开发的控制器的简要概述;我还没有对检索到的数据进行任何检查。

class UsersController extends Controller
{   
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $users = User::all();

        return UserResource::collection($users);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Washery\Http\Request\StoreUser $request
     * @return \Illuminate\Http\Response
     */
    public function store(StoreUser $request)
    {
        User::create($request->all());

        return response()->json(['message' => 'success'], 200);
    }

    /**
     * Display the specified resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $user = User::find($id);

        return new UserResource($user);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Washery\Http\Request\UpdateUser $request
     * @return \Illuminate\Http\Response
     */
    public function update(UpdateUser $request)
    {
        User::update($request->all());

        return response()->json(['message' => 'success'], 200);    
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \Washery\User  $user
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        User::find($id)->delete();

        return response()->json(['message' => 'success'], 200);
    }
}

【问题讨论】:

    标签: php laravel rest laravel-5


    【解决方案1】:

    一种方法是了解请求的来源。如果来自移动端(API 请求),则返回 JSON,否则返回视图。

    if ($request->expectsJson()) {
       return response()->json(['message' => 'success']); // No need to put 200 here.
    } else {
        return view('view.path');
    }
    

    您可以在此处了解有关请求 api 的更多信息:https://laravel.com/api/5.5/Illuminate/Http/Request.html

    【讨论】:

    • 那么错误呢?我是否应该使用相同的方法并覆盖异常处理程序中的“渲染”方法,以便通过移动 Laravel 调用时将错误显示为 JSON?
    • 我建议这样做。因为你不能用 JSON 重定向。它总是会返回 404.blade.php 的内容。
    • 为了让它工作,你需要api.php 中的另一条路线来期待json响应,它指向相同的方法@Washery
    猜你喜欢
    • 2018-12-06
    • 2013-10-07
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    相关资源
    最近更新 更多