📅  最后修改于: 2023-12-03 14:43:46.463000             🧑  作者: Mango
在 Laravel 中,控制器是 MVC(Model-View-Controller)结构中的一个组件,主要用于处理请求和响应。控制器负责从视图接收输入,处理业务逻辑,然后将响应发送回视图。在 Laravel 中,有多种类型的控制器可供选择,让我们来一一了解一下。
普通控制器是最常用的控制器类型。可以使用 Artisan 命令生成一个普通控制器,或者手动创建一个类并继承基类 App\Http\Controllers\Controller
。
php artisan make:controller MyController
控制器中的方法负责处理请求,并返回响应。一般情况下,返回一个视图或 JSON 响应。
class MyController extends Controller
{
public function index()
{
return view('my_view');
}
public function store(Request $request)
{
// 处理请求
return response()->json(['message' => 'ok']);
}
}
资源控制器是基于 RESTful 架构的控制器类型。使用 Artisan 命令生成一个资源控制器,或者手动创建一个类并继承基类 Illuminate\Routing\Controller
。
php artisan make:controller PhotoController --resource
资源控制器中的方法根据 RESTful 架构中的规则来设置。例如,index()
方法获取所有资源列表,create()
方法返回视图以创建一个新资源,store()
方法创建一个新资源,show($id)
方法获取指定的资源,等等。
class PhotoController extends Controller
{
public function index()
{
$photos = Photo::all();
return view('photos.index', ['photos' => $photos]);
}
public function create()
{
return view('photos.create');
}
public function store(Request $request)
{
// 处理创建请求
}
public function show($id)
{
$photo = Photo::findOrFail($id);
return view('photos.show', ['photo' => $photo]);
}
// ...
}
通过使用 RESTful 架构,资源控制器可以更好地组织和管理路由和请求,提高代码可读性和可维护性。
API 资源控制器是专门为 API 开发设计的控制器类型。与普通控制器和资源控制器不同,API 资源控制器主要生成 JSON 响应,而不是渲染视图。可以使用 Artisan 命令生成一个 API 资源控制器,或者手动创建一个类并继承 Illuminate\Routing\Controller
。
php artisan make:controller Api/PhotoController --api
相比于资源控制器,API 资源控制器中没有视图相关代码,只有数据处理和 JSON 响应的代码。
class PhotoController extends Controller
{
public function index()
{
$photos = Photo::all();
return response()->json(['photos' => $photos]);
}
public function store(Request $request)
{
// 处理创建请求
return response()->json(['message' => 'ok'], 201);
}
public function show($id)
{
$photo = Photo::findOrFail($id);
return response()->json(['photo' => $photo]);
}
// ...
}
在某些情况下,我们需要记录用户的操作行为,便于后续的审计和监控。关于操作日志的记录,可以通过自定义控制器类型来完成。
class LoggableController extends Controller
{
protected $logModels = [];
public function __construct()
{
$this->middleware(function ($request, $next) {
$response = $next($request);
$this->log($request, $response);
return $response;
});
}
protected function log(Request $request, $response)
{
foreach ($this->logModels as $model) {
$model->create([
'user_id' => $request->user()->id,
'path' => $request->path(),
'method' => $request->method(),
'response' => $response->content(),
]);
}
}
}
这个控制器类型使用中间件实现了请求和响应的记录。在使用时,需要在控制器中设置 $logModels
属性,指定需要记录的模型。
class MyController extends LoggableController
{
protected $logModels = [Log::class];
// ...
}
Laravel 中的控制器类型包括普通控制器、资源控制器、API 资源控制器和自定义控制器。每个类型的控制器都有各自的特点和应用场景,需要结合实际情况选择适合的控制器类型。