Laravel 什么';这是将RESTful API和web路由结合在一起的正确方法

Laravel 什么';这是将RESTful API和web路由结合在一起的正确方法,laravel,Laravel,假设我想为外部设备(如Android)制作一个RESTful API,同时我想使用web路由和刀片模板使用该API 路由:api/articles/{id}/edit public function API_edit(Article $article) { $article->body = request('body'); $article->save(); return response()->json([...]); } public funct

假设我想为外部设备(如Android)制作一个RESTful API,同时我想使用web路由和刀片模板使用该API

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

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

    return response()->json([...]);
}
public function edit(Article $article)
{
    $article->body = request('body');
    $article->save();

    return redirect()->back()->with(['message' => 'Article edited']);
}
事情是这样的。我该怎么做才能不重蹈覆辙?因为我想创建另一个基本上与API_edit相同的方法是不合适的

路由:文章/{id}/edit

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

    return response()->json([...]);
}
public function edit(Article $article)
{
    $article->body = request('body');
    $article->save();

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

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

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

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

您可以使用\light\Support\Facades\Request facade的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);
}

您可以使用\illumb\Support\Facades\Request facade的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);
}

看看这篇文章,如果我理解正确的话()

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

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

例如:

web.php

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

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

看看这篇文章,如果我理解正确的话()

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

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

例如:

web.php

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

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

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