使用以下代码,我可以将原始数据提供给通过“接受”的API(或AJAX)客户端。 '应用/ JSON'标题和包含Web客户端数据的视图:
if ($request->wantsJson()) {
return $laptops;
} else {
return view('laptops')->withLaptops($laptops);
}
我的问题是,在不将代码复制到每个控制器的情况下,将此逻辑应用于每个请求的最佳方式是什么?
答案 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)
您可以使用namespaces
和routing 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的一个最佳功能。