Php API的Laravel错误处理

Php API的Laravel错误处理,php,laravel,rest,laravel-5,Php,Laravel,Rest,Laravel 5,我正在用Laravel 5.5构建一个web app+REST服务器,这样用户既可以通过web界面在线访问服务,也可以通过移动应用间接使用API 现在的目标是让相同的控制器能够处理API和直接请求,利用Laravel内置的双路由和FormRequests的自动JSON响应。 我想的主要问题是: 如何在同一控制器函数上处理JSON(用于API访问)和HTML视图(用于web访问者)响应 如何管理控制器中的“未找到资源”错误,并随后以所需的方式回复用户 解决第二个问题的一种可能方法是使用“find


我正在用Laravel 5.5构建一个web app+REST服务器,这样用户既可以通过web界面在线访问服务,也可以通过移动应用间接使用API

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

  • 如何在同一控制器函数上处理JSON(用于API访问)和HTML视图(用于web访问者)响应
  • 如何管理控制器中的“未找到资源”错误,并随后以所需的方式回复用户
  • 解决第二个问题的一种可能方法是使用“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);
        }
    }
    

    一种方法是知道请求来自哪里。如果它来自移动设备(API请求),则返回JSON,否则返回视图

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

    您可以在此处了解有关请求api的更多信息:

    那么错误呢?我是否应该使用相同的方法并覆盖异常处理程序中的“render”方法,以便通过mobile Laravel调用时将错误显示为JSON?我建议这样做。因为你不能用JSON重定向。它将始终返回404.blade.php的内容。要使其正常工作,您需要在
    api.php
    中使用另一条路径来期望json响应,该路径指向相同的方法@Washery