Laravel资源控制器通过Route::resource定义RESTful路由,自动生成七种CRUD操作方法,支持only/except筛选,可自定义URI、注入服务、使用中间件及返回JSON响应。

Laravel资源控制器,简单来说,就是为了更方便地处理CRUD(创建、读取、更新、删除)操作而生的。它遵循RESTful架构,让你的代码更简洁、易维护。
php artisan make:controller PhotoController --resource
如何定义资源路由?
资源路由让你可以用一行代码定义多个路由,对应资源控制器的不同方法。比如:
Route::resource('photos', PhotoController::class);这行代码会生成七个路由:
index、
create、
store、
show、
edit、
update和
destroy,分别对应不同的HTTP方法和URI。如果你只需要部分路由,可以使用
only或
except方法:
Route::resource('photos', PhotoController::class)->only(['index', 'show']);
Route::resource('photos', PhotoController::class)->except(['create', 'store', 'destroy']);资源控制器中的方法都有哪些?
资源控制器自带了一些预定义的方法,每个方法都对应一个特定的HTTP请求和操作。
-
index()
: 显示所有资源。通常用于展示资源列表。 -
create()
: 返回一个创建新资源的表单。 -
store()
: 保存新创建的资源。处理POST请求,验证数据,并将数据保存到数据库。 -
show($id)
: 显示单个资源。根据ID查找资源并展示。 -
edit($id)
: 返回一个编辑现有资源的表单。 -
update(Request $request, $id)
: 更新现有资源。处理PUT/PATCH请求,验证数据,并更新数据库中的资源。 -
destroy($id)
: 删除指定资源。处理DELETE请求,从数据库中删除资源。
这些方法都是为了遵循RESTful架构而设计的,每个方法都对应一个特定的HTTP方法和URI。
如何自定义资源控制器的URI?
有时候,你可能想要自定义资源控制器的URI,比如把
/photos改成
/images。这可以通过修改路由定义来实现:
Route::resource('images', PhotoController::class, ['names' => 'photos']);这个
names选项允许你覆盖默认的路由名称。然后,在你的控制器中,你可以使用
route()函数来生成URI:
return redirect()->route('photos.index'); // 生成 /images另外,如果你想完全自定义URI,可以手动定义每一个路由,而不是使用
Route::resource()。
如何处理表单请求?
在
store()和
update()方法中,你需要处理表单请求。Laravel提供了强大的表单验证功能,可以帮助你验证用户输入的数据。
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|max:255',
'description' => 'required',
'image' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2048',
]);
// 创建并保存资源
}$request->validate()方法会验证用户输入的数据,如果验证失败,会自动返回到表单页面,并显示错误信息。验证成功后,你可以使用
$validatedData数组来创建和保存资源。
如何返回JSON响应?
在API开发中,通常需要返回JSON响应。Laravel提供了方便的方法来生成JSON响应:
public function index()
{
$photos = Photo::all();
return response()->json($photos);
}response()->json()方法会将数据转换成JSON格式,并设置正确的Content-Type头部。你还可以自定义HTTP状态码:
return response()->json($photos, 200); // 200 OK return response()->json(['error' => 'Not found'], 404); // 404 Not Found
如何进行依赖注入?
Laravel的依赖注入容器可以帮助你解耦代码,提高可测试性。你可以在资源控制器的构造函数中注入依赖:
protected $photoService;
public function __construct(PhotoService $photoService)
{
$this->photoService = $photoService;
}
public function index()
{
$photos = $this->photoService->getAllPhotos();
return view('photos.index', compact('photos'));
}这样,你就可以在控制器中使用
$this->photoService来访问
PhotoService的方法。这使得你的控制器更简洁,更容易测试。
如何使用中间件?
你可以在资源控制器中使用中间件来处理请求。比如,你可以使用
auth中间件来保护需要登录才能访问的路由:
public function __construct()
{
$this->middleware('auth')->except(['index', 'show']);
}这个例子中,除了
index和
show方法,其他方法都需要用户登录才能访问。你还可以使用自定义中间件来实现更复杂的逻辑。










