Laravel 控制器
控制器的存在主要用于替代路由文件中以闭包形式所有的请求处理逻辑,可以使用控制器来组织这些行为,在MVC框架之中,分为业务模型(M)、用户视图(V)、控制器(C),使用MVC的目的是将M和V的实现代码分离,控制器用于确保业务模型以及用户视图的同步,一旦业务模型进行更改,那么用户视图也会随着更改。
控制器主要存放在app/Http/Controllers/目录下,默认情况下并不会生成,需要使用命令php artisan make:controller TestController进行创建,在此会有一个命名潜规则是“作用+Controller”,如本次的控制器作用是测试则命名方式可为“TestController”即可,之后会在app/Http/Controller目录内生成该类,内容如下:
数据传递

通常我们需要将参数传递到控制器中,在Laravel之中,我们可以通过控制器进行传递,本次我们将实现一个传递id的效果:
命名空间(俗称 “路由绑定”)
在定义路由时,我们通常不需要写入完整的控制器名称,这是因为ProuteServiceProvider几乎将所有的路由文件加载到了包含名称空间的路由组中。比如一个控制器类的完整空间为namespace App\Http\Controllers;,此时我们可以在路由器中写成:
Route::get(‘/id/{id}’, ‘TestController@index’);
是可以找到TestController控制器的,当然如果你有相关的项目需要或自身的习惯也可以写完整的路径,浙江取决于你。
TestController
1 |
|
web.php
1 |
|
单个行为控制器

单个行为控制器说的通俗且简单一点就是,该控制器只用于处理你这一个请求,定义的方法也与普通的控制器有所不同,最为不同的一个点是在方法前面加了两个__,即__invoke函数:
TestController
1 |
|
web.php
1 |
|
视图控制器
与路由一样,控制器也拥有一个视图控制器,而定义方法与路由所相差无几,实现如下,在Laravel项目中,只需要在控制器中添加一个返回视图的方法以及配置路由即可:
TestController
1 |
|
web.php
1 |
|
之后通过访问locahost:8000/test回显的视图将是在resources/下的welcome.blade.php视图文件。
资源控制器(增删改查 “CURD”)
在Laravel中,资源控制器将经典的增删改查简化成了一行行控制器代码,Laravel为我们提供了一套约定的规则,这种规则可以方便我们的代码写的更加的完美且优雅,以下我们可以通过使用Artisan来生成一个资源控制器,使用的参数为--resource:
php artisan make:controller PostController –resource
这与普通的控制器一样,会在``app\Http\Controllers```下创建一个名为PostController的控制器,且自动帮我们生成了CURD方法,我们可以通过对应请求在路由中进行绑定:
1 |
|
| 请求方式 | Route | FA | 路由名称 |
|---|---|---|---|
| GET | /post | 所有数据展现 | index |
| GET | /post/create | 插入数据 | create |
| POST | /post/store | 存储刚刚新提交的数据 | store |
| GET | /post/{id} | 显示某个数据 | show |
| GET | /post/{id}/edit | 修改某个数据 | edit |
| PUT | /post/{id} | 更新数据库中某个资源 | update |
| DELETE | /post/{id} | 删除某个数据 | destory |
如果在路由中使用该资源控制器也非常的简单,可以在web.php类中来绑定资源控制器即可:
Route::resource(‘post’, ‘PostController’);
实际开发过程中的伪造方法
在实际开发的过程中,我们会遇到很多问题,前端表单支持GET/POST方法但不支持PUT/DELETE的请求方式,所以我们在前端中需要使用一个Blade指令**@method**来使用伪造HTTP动作:
1 | <form action="/post/update" method="POST"> |
指定资源路由
指定资源路由在官方文档中被命名为“部分资源路由”,这里我们以白名单与黑名单为例子让读者更加进一步理解:
1 | // 使用所有 |
白名单(only)
白名单指only,中文译名为只,顾名思义指这个处理器包含什么样的行为,在Laravel之中默认行为是所有。
1 | // 白名单 -> Only 只有…… |
黑名单 (except)
Laravel之中的except可以理解为是黑名单,但原意思是“除了……之外”,所以以下例子为除了create、update方法,PostController之中的资源路由我全要。
1 | // 黑名单 -> except 除了……以外 |
命名资源路由
在资源控制器名称写入路由的时候,当处理需求较小的情况下还好,但一旦数据非常的庞大,我们除了对路由进行分组,也有一个命名资源路由的方法,只需要使用names即可:
1 | Route::resource('post', 'PostController')->names([ |
资源路由参数
为了让前端变得更加美妙且更好的分辨,Laravel为我们提供了一种用于命名资源路由的方法parameters:
1 | Route::resource('post', 'PostController')->parameters([ |
之后将会生成/post/{post_test}的url构造。
