【问题标题】:What's the correct approach to RESTful API and web routes togetherRESTful API和Web路由的正确方法是什么
【发布时间】:2020-02-23 10:35:44
【问题描述】:

假设我想为外部设备(如 Android)制作一个 RESTful API,同时我想使用 Web 路由和 Blade 模板来使用这个 API。

路线: api/articles/{id}/edit

public function API_edit(Article $article)
{
    $article->body = request('body');
    $article->save();

    return response()->json([...]);
}

现在是这样。我应该怎么做才能不重复自己?因为我认为创建另一个与 API_edit 基本相同的方法是不行的。

路线:articles/{id}/edit

public function edit(Article $article)
{
    $article->body = request('body');
    $article->save();

    return redirect()->back()->with(['message' => 'Article edited']);
}

这肯定是错误的,这是一个简单的例子,但如果逻辑更复杂怎么办?感觉不对。

【问题讨论】:

  • 为什么不从 API_edit 调用 edit,在 edit 方法中创建一个参数来说明它是否必须返回视图或 JSON 数据?

标签: laravel


【解决方案1】:

如果我正确理解您的问题,请查看此帖子 (Laravel Web and API controller structure. Separate vs DRY)。

当在 RESTful API 中用于 Vue/Angular 等外部框架或任何外部服务时,您需要设置和“复制”两者的路由,并且这些路由也在 web.php 内部处理处理内部请求。

但是,您仍然可以将这些请求指向同一个控制器。

如下:

web.php

Route::get('/some/web/request', 'YourController@function')

api.php

Route::get('/some/api/request', 'YourController@function');

【讨论】:

    【解决方案2】:

    在这种情况下,这可能正是您应该做的。正如您所说,逻辑可能更复杂,在这种情况下,您可能不应该将其留在控制器中,而不管跨 web/api 路由重用。如果您的控制器需要执行的操作有任何复杂性,请将其提取到某种服务中。

    【讨论】:

      【解决方案3】:

      你可以使用\Illuminate\Support\Facades\Request门面的wantsJson方法来检查:

      public function edit(Article $article)
      {
          $article->body = request('body');
          $article->save();
          $response = ['message' => 'Article edited'];
      
          if (Request::wantsJson()) {
              return response()->json($response);
          }
      
          return redirect()->back()->with($response);
      }
      

      【讨论】:

        猜你喜欢
        • 2022-06-28
        • 2014-03-11
        • 2015-02-10
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        相关资源
        最近更新 更多