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

时间:2017-09-27 05:11:41

标签: laravel api

我的应用程序存在问题,即" hybrid",我的意思是" hybrid"控制器必须管理两个视图和API。

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

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

我不喜欢在每种控制器方法中都有条件的事实。

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

我该怎么办?

1 个答案:

答案 0 :(得分:5)

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

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

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

Ex:在您的控制器中:

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),您可以在不更改所有控制器的情况下执行此操作。

相关问题