提供API和Web请求的有效方式

时间:2016-11-04 16:24:28

标签: laravel

使用以下代码,我可以将原始数据提供给通过“接受”的API(或AJAX)客户端。 '应用/ JSON'标题和包含Web客户端数据的视图:

    if ($request->wantsJson()) {
        return $laptops;
    } else {
        return view('laptops')->withLaptops($laptops);
    }

我的问题是,在不将代码复制到每个控制器的情况下,将此逻辑应用于每个请求的最佳方式是什么?

2 个答案:

答案 0 :(得分:0)

很难给出最佳答案,因为您没有提供有关您的背景的详细信息。这是一种可能性:

您可以使用两套控制器

App\Http\Controllers
App\Http\Controllers\API

并使用resource controller,您也可以实施API版本控制

Route::resource('laptop', 'LaptopController');
Route::resource('api/v1/laptop', 'API\LaptopController');

最后,您将控制器逻辑抽象为服务类,例如

class LaptopService {

    protected $laptop;

    public function __construct($LaptopId){ 
          $this->laptop = Laptops::findOrFail($LaptopId);
    }

    public function get() {
       return $this->laptop;
    }
}

然后在你的控制器中你可以有

public function show($id){
    $ls = new LaptopService($id)

    //In App\Http\Controllers
    //return view('laptops')->withLaptops($ls->get());
    //In  App\Http\Controllers\API
    //return Response::json($ls->get(), 200); 
 }

答案 1 :(得分:0)

您可以使用namespacesrouting groups的概念来实现它。 您可以创建2个具有相同名称但具有不同名称空间的控制器。

例如在routes.php

// Routes pointing to the Controllers Within The "App\Http\Controllers" Namespace
Route::resource('laptops', 'LaptopsController');

Route::group(['prefix' => 'api', namespace' => 'Api'], function()
{
    // Routes pointing to Controllers Within The "App\Http\Controllers\Api" Namespace
    Route::resource('v1/laptops', 'LaptopsController');
});
  

您的控制器应位于名称空间

中      
      
  • App \ Http \ Controllers - LaptopsComputer.php
  •   
  • App \ Http \ Controllers \ Api - LaptopsComputer.php
  •   

您的控制器应包含以下命名空间:

// -------- App\Http\Controllers\LaptopsComputer.php --------
namespace App\Http\Controllers;
class LaptopsComputer exends Controller {
    // Methods with reponse to WEB calls...
}

// -------- App\Http\Controllers\Api\LaptopsComputer.php --------
namespace App\Http\Controllers\Api;
class LaptopsComputer exends Controller {
    // Methods with reponse to API calls...
}

有关路线的更多参考,请查看 - Laravel Routing Groups

希望这可以帮助您正确使用Laravel的一个最佳功能。