编写具有不同响应类型的(Web和API)相同代码的最佳方法?

时间:2019-01-26 14:02:52

标签: laravel api web

我正在做一个laravel项目,我必须为Web应用程序以及具有相同业务逻辑的API编写代码。

由于业务逻辑没有差异,因此我正在考虑以特征编写代码,并在不同的控制器中使用它们,并根据请求标头发送响应。这样,相同的代码将同时为网络应用程序和移动应用程序提供服务。

使用特征,我可以编写不同的路由,并轻松地为Web和API创建不同的控制器。

例如

In web.php
Route::get('users','UsersController@index');
In api.php
Route::get('users','Api\UsersController@index');

然后使用trait我只能编写一个称为index的函数或如下所示的任何其他名称。 现在,我使用Request类的wantJson()方法检查请求是否需要json。

public function index(Request $request){
     $users = User::all();

    if($request->wantsJson()){
       return response()->json(['users',$users]); 
    }
    return view('uses.index',compact('users'));
}

有没有更好的方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

创建服务,然后将您的通用代码放入其中并使用它。

在Laravel应用程序上,只需进入app/Services,然后创建一个类:[Something]Service。添加[Some]()方法并粘贴代码以创建新实体

public function index(Request $request)
{
     $users = User::all();

    if($request->wantsJson()){
       $users = response()->json(['users',$users]); 
    }
    return $users;
}

现在,您可以编辑UsersController并通过构造函数注入服务,因此可以将其用作属性。

最后,您的控制器方法应如下所示:

public function webControllerFunction(Request $request)
{
    $users = $this->[Something]Service->index($request);

    return view('uses.index',compact('users'));
}

public function apiControllerFunction(Request $request)
{
    return $this->[Something]Service->index($request);
}