RESTful 资源控制器
最后更新于:2022-04-01 15:04:00
资源控制器可让你无痛建立和资源相关的 RESTful 控制器。例如,你可能希望创建一个控制器,它可用来处理针对你的应用程序所保存相片的 HTTP 请求。我们可以使用 make:controller Artisan 命令,快速创建这样的控制器:
`php artisan make:controller PhotoController`
接着,我们注册一个指向此控制器的资源路由:
`Route::resource('photo', 'PhotoController');`
此单一路由声明创建了多个路由,用来处理各式各样和相片资源相关的 RESTful 行为。同样地,产生的控制器已有各种和这些行为绑定的方法,包含用来通知你它们处理了那些 URI 及动词。
由资源控制器处理的行为
|动词|路径|行为|路由名称|
|--------|--------|--------|
|GET|/photo|索引|photo.index|
|GET|/photo/create|创建|photo.create|
|POST|/photo|保存|photo.store|
|GET|/photo/{photo}|显示|photo.show|
|GET|/photo/{photo}/edit|编辑|photo.edit|
|PUT/PATCH|/photo/{photo}|更新|photo.update|
|DELETE|/photo/{photo}|删除|photo.destroy|
##自定义资源路由
除此之外,你也可以指定让路由仅处理一部分的行为:
~~~
Route::resource('photo', 'PhotoController',
['only' => ['index', 'show']]);
Route::resource('photo', 'PhotoController',
['except' => ['create', 'store', 'update', 'destroy']]);
~~~
所有的资源控制器行为默认都有个路由名称。然而你可在选项中传递一个 names 数组来重载这些名称:
~~~
Route::resource('photo', 'PhotoController',
['names' => ['create' => 'photo.build']]);
~~~
## 处理嵌套资源控制器
在你的路由声明中使用「点」号来「嵌套化」资源控制器:
~~~
Route::resource('photos.comments', 'PhotoCommentController');
~~~
此路由会注册一个「嵌套的」资源,可透过像 photos/{photos}/comments/{comments} 这样的 URL 来访问。
~~~
class PhotoCommentController extends Controller {
/**
* 显示指定照片的评论。
*
* @param int $photoId
* @param int $commentId
* @return Response
*/
public function show($photoId, $commentId)
{
//
}
}
~~~
## 在资源控制器中加入其他的路由
除了默认的资源路由外,若你还需要在资源控制器中加入其他路由,应该在调用 Route::resource 之前先定义它们:
~~~
Route::get('photos/popular', 'PhotoController@method');
Route::resource('photos', 'PhotoController');
~~~