2017-09-27 77 views
0

我的应用程序出现问题,即“混合”,我的意思是“混合”控制器必须同时管理这两个视图API。管理来自同一个控制器的视图和API

所以,基本上,每个控制器,我必须检查:

if $request->wantsJson(){ 
    ... // Client rendering using Angular, return json 
}else{ 
    // Server rendering Using blade, return view 
} 

我不喜欢这样的事实,以在每一个控制器方法的条件。

我也不希望有一个API文件夹与我的所有控制器的副本,会有很多重复的代码。

我应该怎么做?

+0

使您的代码更模块化,这可能会帮助您复制代码 –

回答

2

我建议创建一个单独的类来处理输出ex:class ResultOutput与方法output

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

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

例如:在你的控制器:

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),你可以做到这一点而无需更改所有控制器。

+0

另一种方式将扩展视图类和修改make方法 – madalinivascu

相关问题