Laravel 简单入门,控制器的使用(二)
一、创建控制器
MVC 模式中 C 代表控制器,用于接收 HTTP 请求,从而进行逻辑处理。有两种方式可以创建控制器,IDE 直接创建,或使用命令生成一个:
php artisan make:controller TaskController
通过设置路由来访问创建好的控制器,参数二:控制器@方法名
Route::get('task', 'TaskController@index');
Route::get('task/read/{id}', 'TaskController@read');
二、资源控制器
1、Laravel 的资源路由通过单行代码即可将典型的「CURD (增删改查)」路由分配给控制器。
对于这种控制器,我们可以将它设置为资源型控制器,不要大量设置路由;比如BlogController;
php artisan make:controller BlogController --resource
生成了的资源控制器会产生 7 个方法,配置好路由后会自动生成相关内容
2、你可以通过将数组传参到 resources
方法中的方式来一次性的创建多个资源控制器:
//单个资源路由 Route::resource('blogs', 'BlogController'); //批量定义资源路由 Route::resources([ 'blog' => BlogController::class, 'posts' => BlogController::class, ]);
3、资源控制器操作处理
从上图可知,如果我们直接访问edit,就会报404:
http://la8.com/blogs/edit/10 //正确的访问方式: http://la8.com/blogs/10/edit
使用router助手函数也一样,它规定了参数名称必须blog
echo route('blogs.edit',['blog'=>10]);
如果你不知道规则,还有一条命令可以直接查看目前可用的路由以及命名;
php artisan route:list
4、部分资源路由
我们也可以限制资源路由只开放部分方法或排除部分方法,可以用命令查看;
//方法一:只有 index(),show()可访问 Route::resource('blogs', 'BlogController') ->only(['index', 'show']); //方法二:排除 index(),show()的其它方法可访问 Route::resource('blogs', 'BlogController') ->except(['index', 'show']);
5、API路由
资源控制器还有一种不需要 HTML 页面方法的 API 路由,只提供数据接口;
//API 资源,并不需要 HTML 页面(create,edit),会排除 Route::apiResource('blogs', 'BlogController'); //批量方式 Route::apiResources([ 'blogs' => 'BlogController' ]);
当然,也支持一开始就生成一个不包含 HTML 页面方法的资源控制器;要注意的是,对应的资源路由,直接使用 api 资源路由即可;
php artisan make:controller CommentController --api
Route::apiResource('comments', 'CommentController');
三、嵌套资源
有时可能需要定义一个嵌套的资源型路由。例如,博客可能被添加了多个评论。
//嵌套资源路由 Route::resource('blogs.comments', 'CommentController');
我们访问edit,需要同时博客ID和评论ID:
http://la8.com/blogs/10/comments/20/edit
而实际上,每个 id 都是独立唯一的,并不需要父 id 和子 id 同时存在
//浅层嵌套 Route::resource('blogs.comments', 'CommentController')->shallow();//现在只有评论ID就可以