API的{Laravel错误处理

时间:2018-01-23 16:40:41

标签: php laravel rest laravel-5


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

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

  1. 如何在同一控制器功能上处理JSON(用于API访问)和HTML视图(针对Web访问者)响应?
  2. 如何管理"未找到资源"控制器中的错误,然后以所需的方式回复用户?
  3. 第二个问题的可能方法是使用" 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);
        }
    }
    

1 个答案:

答案 0 :(得分:3)

一种方法是知道请求的来源。如果它来自移动(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