正文 【Laravel基础】3. 控制模块基础知识 拾年之璐 V管理员 /2021年 /242 阅读 0203 ## 3. 控制模块基础知识 [TOC] ### 3.1 响应设置 路由和控制器处理完业务都会返回一个发送到浏览器的响应:`return`。几种常用的返回格式如下所示: 如果是字符串,会直接输出。 如果是数组,则会输出`json` 格式,本身是 `Response` 对象。示例: ```php public function hello3() { return [1, 2, 3]; //输出json 格式 // return response([1, 2, 3]); //同上 // return response()->json([1, 2, 3]); //同上 } ``` 结果:  如果使用 `response()` 输出的话,可以设置状态码和响应头信息: ```php public function hello3() { return response([1, 2, 3], 400); //状态码:400 } ``` 结果:  也可以给 `HTTP 添加或修改标头`,比如将html 解析模式改成文本plain 模式: ```php public function hello3() { return response('这里是文本', 201)->header('Content-Type', 'text/plain'); } ``` 输出结果:  结合上面的响应操作,再结合 `view() `视图功能,显示纯HTML 代码页面: ```php public function hello3() { return response() ->view('hello', ['name' => '张三', 'id' => '1001']) ->header('Content-Type', 'text/plain'); } ``` 结果:  ### 3.2 资源控制器 `资源控制器`是某个特定场景下的产物。比如在博客系统中,默认有帖子留言等类型的接口,该资源控制器可以默认生成所有的接口。这是一种专门处理CURD(增删改查)的控制器,方法很多且方法名基本固定。 可以手动创建,不过比较复杂,推荐使用命令直接创建: ``` php artisan make:controller BlogController --resource ``` 这时,该命令会创建一个名为 `BlogController` 的控制器,其初始状态如下: ```php 'BlogController', 'comments' => 'CommentController' ]); ``` 怎么看是否已生成路由?使用下面的命令可以查看: ``` php artisan route:list ``` 结果:  如果我们注册了资源路由,那么如上图的资源路由URI 和名称均自动创建生效。 这里注意,默认生成的控制器,注释中的返回类型为 `@return \Illuminate\Http\Response` ,测试的时候,可以修改为`string`。 然后在每个路由的控制器中,写入一些基本的测试信息,如: ```php /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // return response('index'); } ``` 我们也可以限制资源路由只开放部分方法或排除部分方法。 示例:只有`index()` , `show()` 可访问 ```php //单个资源路由 Route::resource('blogs', 'BlogController') ->only(['index','show']); ``` 结果:  示例:排除 `index()` , `show()` 的其它方法可访问 ```php //单个资源路由 Route::resource('blogs', 'BlogController') ->except(['index','show']); ``` 结果:  资源控制器还有一种不需要 HTML 页面方法的`API 路由`,只提供数据接口。 这种类型的资源控制器,可以使用如下命令创建: ``` php artisan make:controller CommentController --api ``` 这时,创建的控制类,初始内容如下: ```php shallow()` 实现浅层嵌套方法。格式: ``` Route::resource('blogs.comments', 'CommentController')->shallow(); ``` 结果:  然后修改前往的 `edit方法` : ```php public function edit($id) { // return '编辑博文下的评论id:'.$id; } ``` 结果:  ### 3.4 自定义路由 如果觉得默认的资源控制器的资源路由命名过长,可以自己自定义,有两种方式。 一种是修改单一的方法路由: ```php Route::resource('blogs.comments', 'CommentController') ->name('index','b.c.i'); ``` 结果:  另一种是`修改多个路由`: ```php Route::resource('blogs.comments', 'CommentController') ->names([ 'index'=>'b.c.i', 'store'=>'b.c.s' ]); ``` 结果:  然后,就可以在控制类、路由中,调用Name比较短的名字。 如果觉得资源路由的参数不符合你的心意,也可以改变: ```php Route::resource('blogs.comments', 'CommentController') ->name('index','b.c.i') ->parameter('blogs','id'); ``` 未改变,访问的方式是: ```php route('b.c.i', ['blogs' => 10]); ``` 改变后,访问的方式是: ```php route('b.c.i', ['id' => 10]); ``` 当然,也可以对多个参数进行修改,如: ```php Route::resource('blogs.comments', 'CommentController') ->parameters([ 'blogs' => 'blog_id', 'comments' => 'comment_id' ]); ``` 这时,访问 `blogs.comments.edit` 的路由,访问方式是: ```php return route('blogs.comments.edit', ['blog_id' => 10, 'comment_id' => 1000]); ``` ### 3.5 表单伪造和CSRF保护 之前的数据,都是通过GET请求获取的。而表单的数据提交,是通过POST请求实现。 首先在TaskController下创建两个方法。 一个是表单页: ```php public function form() { return view('form'); } ``` 表单页路由: ``` Route::get('task/form', 'TaskController@form'); ``` 然后创建表单页面,内容为: ```php+HTML 表单 用户名: 提交 ``` 另一个是接受表单的数据路由: ```php Route::post('task/getform', function (){ echo '接收数据:'.Request::input('user'); echo ''; echo '请求方法:'.Request::method(); }); ``` 执行结果为:   在这个简短的实例中,为了避免被跨站请求伪造攻击,框架提供了`CSRF 令牌保护`,请求时验证: ```php ``` 表单可以实现`POST` 提交方式,那其它提交方式该如何实现呢?可以采用伪造技术: ```php ``` **在form里增加这一行,然后把请求的方法,由post修改为any**,再次请求,结果为:  对于CSRF 令牌保护和表单伪造提交方式,也支持快捷方式的声明,如下: ```php @csrf @method('PUT') ``` 完整: ```php+HTML 表单 @csrf @method('PUT') 用户名: 提交 ``` 我们可以设置全局 `取消CSRF验证`,把下图所示注释掉即可:  `但是,不推荐这样。` 我们可以`只将某些URL 关闭csrf 验证`,通过设置csrf 白名单的方式实现。 白名单具体设置位置在:中间件目录下的`VerifyCsrfToken.php` 文件,可以写单个的路由,也可以使用通配符,设置一系列路由: ```php class VerifyCsrfToken extends Middleware { /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ // 在这里添加关闭CSRF的路由 'api/*', ]; } ``` 以上。 本文采用创作共用版权 CC BY-NC-SA 3.0 CN 许可协议,转载或复制请注明出处! -- 展开阅读全文 --