【问题标题】:Managing views and api from the same controller从同一个控制器管理视图和 api
【发布时间】:2018-03-08 11:19:45
【问题描述】:

我的应用有一个问题,即“混合”,我所说的“混合”控制器必须同时管理视图和 API。

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

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

我不喜欢在每个控制器方法中都有一个条件。

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

我该怎么做?

【问题讨论】:

  • 使您的代码更加模块化,这可能有助于您复制代码

标签: laravel api


【解决方案1】:

我建议创建一个单独的类来处理输出,例如: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),您可以在不更改所有控制器的情况下完成。

【讨论】:

  • 另一种方法是扩展视图类并修改make方法
  • 我需要在 web.php 和 api.php 文件中注册 2 条路由吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
相关资源
最近更新 更多