Laravel 从同一控制器管理视图和api
我的应用程序有一个问题,那就是“混合”,我所说的“混合”控制器必须管理两个视图和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文件夹中有我所有控制器的副本,
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条路由?