Laravel 从同一控制器管理视图和api

Laravel 从同一控制器管理视图和api,laravel,api,Laravel,Api,我的应用程序有一个问题,那就是“混合”,我所说的“混合”控制器必须管理两个视图和API 因此,基本上,对于每个控制器,我必须检查: if $request->wantsJson(){ ... // Client rendering using Angular, return json }else{ // Server rendering Using blade, return view } 我不喜欢每个控制器方法中都有一个条件 我也不希望API文件夹中有我所有控制器的副本,

我的应用程序有一个问题,那就是“混合”,我所说的“混合”控制器必须管理两个视图和API

因此,基本上,对于每个控制器,我必须检查:

if $request->wantsJson(){
    ... // Client rendering using Angular, return json
}else{
   // Server rendering Using blade, return view
}
我不喜欢每个控制器方法中都有一个条件

我也不希望API文件夹中有我所有控制器的副本,因为会有很多重复的代码


我该怎么做

我建议创建一个单独的类来处理输出,例如:
classresultoutput
方法,
output

因此,在控制器中,当您准备好输出数据时,只需创建ResultOutput类的新实例,并使用相关数据调用方法
output

在ResultOutput类中,注入请求对象,以便根据上述逻辑确定输出的方法

例:在控制器中:

return (new ResultOutput())->output($data);
在ResultOutput类中:

class ResultOutput()
{
    private $type;

    public __construct(Request $request) {
        $this->output = 'view';     
        if ($request->wantsJson()) {
            $this->output = 'json';
        }
    }


    public method output($data) {
        if ($this->type =='view') {
            // return the view with data
        } else {
            // return the json output
        }
    }

}

通过这种方式,如果您需要引入新的输出方法(例如:xml),您可以在不更改所有控制器的情况下实现

使代码更加模块化这可能有助于复制代码另一种方法是扩展view类并修改make方法我是否需要在web.php和api.php文件中注册2条路由?