1. 控制器基础
1.1 命令创建控制器
可以通过命令 php artisan make:controller Index 来创建一个Index 的控制器,它在 app\Http\Controllers\Index.php 下,默认创建的这个控制器是空的。
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class Index extends Controller{//}
1.2 路由绑定控制器
继续在上一次的 my.php 这个route 文件下从新定义一个路由,将它与我们感刚刚创建的控制器 Index 进行绑定。my.php 文件下添加下面的方法,第二个参数绑定控制器和控制器的方法,中间用@来隔开
<?php/*** 路由绑定控制器方法*/Route::get('user', 'Index@index');
<br />`Index.php` 这个控制器下添加对应的方法 `index`
<?phppublic function index(){return '来自控制器Index,方法index()';}
1.3 路由命名空间
上述通过命令 php artisan make:controller 控制器名称 创建的控制器 在App\Http\Contrlooer 目录下,如果不进行分组,当业务功能上去后势必会站目录结构占满控制器文件,所以我们需要分层,也就是额外添加目录,如: php artisan make:controller my/index 来创建我需要的分层,如下图:
现在,向这个 my/index.php 添加代码如下
<?phpnamespace App\Http\Controllers\my;use App\Http\Controllers\Controller;use Illuminate\Http\Request;class index extends Controller{// 添加一个最基本的方法public function fun1(){return 'from my fun1()';}}
然后向 my.php 中添加代码
<?php/*** 基本路由命名空间的使用*/Route::get('user', 'my\Index@fun1');
1.4 参数传递
和路由中的使用别无二至,先去 my.php 中定义路由
<?php/*** 传递参数*/Route::get('say/{name}/{msg?}', 'my\Index@fun2');
然后去对应控制下,添加 fun2()
<?phppublic function fun2($name, $msg = 'to my fun2()'){return '我是' . $name ."\t" . $msg;}
1.5 使用组+空间
1.5.1 基本操作
注释掉上面在 my.php 中定义的方法,现在从写下面代码
<?php/*** 命名空间组* 在 APP\Http\Controllers\my 命名空间下的控制器*/Route::namespace('my')->group(function () {Route::get('fun1', 'Index@fun1');Route::get('fun2/{name}/{msg?}', 'Index@fun2');});
1.5.2 添加name+重定向
再次向 my.php 中添加如下代码
<?php/*** 命名空间组 + name + 重定向路由*/Route::namespace('my')->group(function () {Route::get('addUser/{name}/{age}', 'Index@addUser')->name('add');Route::get('delUser/{id}', 'Index@delUser')->name('del');Route::get('updUser', 'Index@updUser')->name('upd');Route::get('selUser', 'Index@selUser')->name('sel');});// 路由重定向Route::get('1/{name}/{age}', function ($name, $age) {return redirect()->route('add', [$name, $age], 301);});Route::get('2/{id}', function ($id) {return redirect()->route('del', [$id], 301);});Route::get('3', function () {return redirect()->route('upd');});Route::get('4', function () {return redirect()->route('sel');});
向对应的控制器 my\Index.php 中添加 CURD 这四个方法
<?phppublic function addUser($name, $age){return "[addUser] name: $name, age: $age";}public function delUser($id){return "[delUser] id: $id";}public function updUser(){return "[updUser]";}public function selUser(){return "[selUser]";}
测试:
测试1
测试2
测试3
测试4
2. 单行为控制器
只会处理一个行为,也就是说就干一件事,可以在 __invoke 方法中进行设置。创建命令 php artisan make:controller ShowProfile --invokable
例如:我这里在 my 下创建 php artisan make:controller Single --invokable
<?phpnamespace App\Http\Controllers\my;use App\Http\Controllers\Controller;use Illuminate\Http\Request;class Single extends Controller{public function __invoke(Request $request){return 'in my\Single\__invoke()'; // 添加代码}}
访问的时候,我们不需要指定控制器下的方法,更不需要继续在定义的单行为控制器下去写其他方法(这是无效的)
3. 资源控制器
创建 php artisan make:controller my/Resource --resource , 里面已经定义好了方法和使用的标准。

<?phpnamespace App\Http\Controllers\my;use App\Http\Controllers\Controller;use Illuminate\Http\Request;class Resource extends Controller{public function index(){//}public function create(){//}public function store(Request $request){//}public function show($id){//}public function edit($id){//}public function update(Request $request, $id){//}public function destroy($id){//}}
填充控制器方法
<?phpnamespace App\Http\Controllers\my;use App\Http\Controllers\Controller;use Illuminate\Http\Request;class Resource extends Controller{public function index(){return 'index()';}public function create(){return 'creat()';}public function store(Request $request){return 'store()';}public function show($id){return 'show()';}public function edit($id){return 'edit';}public function update(Request $request, $id){return 'update';}public function destroy($id){return 'destroy';}}
my.php 下添加路由
<?php/*** 资源控制器组* 请求方式 对应方法* GET index()* GET cretate()* POST store()* GET show()* GET edit()* PUT/PATCH update()* DELETE DELETE*/Route::namespace('my')->group(function () {// index()Route::get('index', 'Resource@index');// create()Route::get('create', 'Resource@create');// store()Route::post('store', 'Resource@store');// show()Route::get('show', 'Resource@show');// update()Route::PUT('update', 'Resource@update');// destroy()Route::DELETE('destroy', 'Resource@destroy');});
测试资源方法
index()一需要get请求访问
create()一需要get请求访问
store()一需要post请求访问,需要加入白名单
4. 控制器中间件
先创建一个测试的控制器 php artisan make:controller my/Mid ,并且加入三个方法fun1、fun2、fun3
<?phpnamespace App\Http\Controllers\my;use App\Http\Controllers\Controller;use Illuminate\Http\Request;class Mid extends Controller{public function fun1(){return '我是fun1()';}public function fun2(){return '我是fun2()';}public function fun3(){return '我是fun3()';}}
my.php 中添加自定义的路由
<?php/*** 控制器中间件*/Route::namespace('my')->group(function () {Route::get('fun1', 'Mid@fun1');Route::get('fun2', 'Mid@fun2');Route::get('fun3', 'Mid@fun3');});
4.1 所有方法都使用这个中间件
<?php// 在构造方法中使用中间件可以有效的控制public function __construct(){// 使用这种方式,所有的方法都走中间件$this->Middleware('test');}
4.2 限制哪些方法可以用到这个中间件
<?php// 在构造方法中使用中间件可以有效的控制public function __construct(){// 限制只有 fun1和fun2方法会使用到中间件$this->Middleware('test')->only(['fun1','fun2']);}
4.3 限制哪些方法不可以用到这个中间件
<?php// 在构造方法中使用中间件可以有效的控制public function __construct(){// 限制只有 fun1和fun2方法会不会使用这个·中间件$this->Middleware('test')->except(['fun1','fun2']);}

