1. 控制器基础

1.1 命令创建控制器

可以通过命令 php artisan make:controller Index 来创建一个Index 的控制器,它在 app\Http\Controllers\Index.php 下,默认创建的这个控制器是空的。

  1. <?php
  2. namespace App\Http\Controllers;
  3. use Illuminate\Http\Request;
  4. class Index extends Controller
  5. {
  6. //
  7. }

1.2 路由绑定控制器

继续在上一次的 my.php 这个route 文件下从新定义一个路由,将它与我们感刚刚创建的控制器 Index 进行绑定。my.php 文件下添加下面的方法,第二个参数绑定控制器和控制器的方法,中间用@来隔开

  1. <?php
  2. /**
  3. * 路由绑定控制器方法
  4. */
  5. Route::get('user', 'Index@index');
  1. <br />`Index.php` 这个控制器下添加对应的方法 `index`
  1. <?php
  2. public function index()
  3. {
  4. return '来自控制器Index,方法index()';
  5. }

测试一下,通过了
image.png

1.3 路由命名空间

上述通过命令 php artisan make:controller 控制器名称 创建的控制器 在App\Http\Contrlooer 目录下,如果不进行分组,当业务功能上去后势必会站目录结构占满控制器文件,所以我们需要分层,也就是额外添加目录,如: php artisan make:controller my/index 来创建我需要的分层,如下图:
image.png
现在,向这个 my/index.php 添加代码如下

  1. <?php
  2. namespace App\Http\Controllers\my;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. class index extends Controller
  6. {
  7. // 添加一个最基本的方法
  8. public function fun1()
  9. {
  10. return 'from my fun1()';
  11. }
  12. }

然后向 my.php 中添加代码

  1. <?php
  2. /**
  3. * 基本路由命名空间的使用
  4. */
  5. Route::get('user', 'my\Index@fun1');

测试一下
image.png

1.4 参数传递

和路由中的使用别无二至,先去 my.php 中定义路由

  1. <?php
  2. /**
  3. * 传递参数
  4. */
  5. Route::get('say/{name}/{msg?}', 'my\Index@fun2');

然后去对应控制下,添加 fun2()

  1. <?php
  2. public function fun2($name, $msg = 'to my fun2()')
  3. {
  4. return '我是' . $name ."\t" . $msg;
  5. }

测试一下
image.png

1.5 使用组+空间

1.5.1 基本操作

注释掉上面在 my.php 中定义的方法,现在从写下面代码

  1. <?php
  2. /**
  3. * 命名空间组
  4. * 在 APP\Http\Controllers\my 命名空间下的控制器
  5. */
  6. Route::namespace('my')->group(function () {
  7. Route::get('fun1', 'Index@fun1');
  8. Route::get('fun2/{name}/{msg?}', 'Index@fun2');
  9. });

访问路径测试 fun1
image.png
访问路劲测试 fun2/xs
image.png

1.5.2 添加name+重定向

再次向 my.php 中添加如下代码

  1. <?php
  2. /**
  3. * 命名空间组 + name + 重定向路由
  4. */
  5. Route::namespace('my')->group(function () {
  6. Route::get('addUser/{name}/{age}', 'Index@addUser')->name('add');
  7. Route::get('delUser/{id}', 'Index@delUser')->name('del');
  8. Route::get('updUser', 'Index@updUser')->name('upd');
  9. Route::get('selUser', 'Index@selUser')->name('sel');
  10. });
  11. // 路由重定向
  12. Route::get('1/{name}/{age}', function ($name, $age) {
  13. return redirect()->route('add', [$name, $age], 301);
  14. });
  15. Route::get('2/{id}', function ($id) {
  16. return redirect()->route('del', [$id], 301);
  17. });
  18. Route::get('3', function () {
  19. return redirect()->route('upd');
  20. });
  21. Route::get('4', function () {
  22. return redirect()->route('sel');
  23. });

向对应的控制器 my\Index.php 中添加 CURD 这四个方法

  1. <?php
  2. public function addUser($name, $age)
  3. {
  4. return "[addUser] name: $name, age: $age";
  5. }
  6. public function delUser($id)
  7. {
  8. return "[delUser] id: $id";
  9. }
  10. public function updUser()
  11. {
  12. return "[updUser]";
  13. }
  14. public function selUser()
  15. {
  16. return "[selUser]";
  17. }

测试:

测试1
image.png
测试2
image.png
测试3
image.png
测试4
image.png


2. 单行为控制器

只会处理一个行为,也就是说就干一件事,可以在 __invoke 方法中进行设置。创建命令 php artisan make:controller ShowProfile --invokable
例如:我这里在 my 下创建 php artisan make:controller Single --invokable

  1. <?php
  2. namespace App\Http\Controllers\my;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. class Single extends Controller
  6. {
  7. public function __invoke(Request $request)
  8. {
  9. return 'in my\Single\__invoke()'; // 添加代码
  10. }
  11. }

访问的时候,我们不需要指定控制器下的方法,更不需要继续在定义的单行为控制器下去写其他方法(这是无效的)
image.png


3. 资源控制器

创建 php artisan make:controller my/Resource --resource , 里面已经定义好了方法和使用的标准。


image.png

  1. <?php
  2. namespace App\Http\Controllers\my;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. class Resource extends Controller
  6. {
  7. public function index()
  8. {
  9. //
  10. }
  11. public function create()
  12. {
  13. //
  14. }
  15. public function store(Request $request)
  16. {
  17. //
  18. }
  19. public function show($id)
  20. {
  21. //
  22. }
  23. public function edit($id)
  24. {
  25. //
  26. }
  27. public function update(Request $request, $id)
  28. {
  29. //
  30. }
  31. public function destroy($id)
  32. {
  33. //
  34. }
  35. }

填充控制器方法

  1. <?php
  2. namespace App\Http\Controllers\my;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. class Resource extends Controller
  6. {
  7. public function index()
  8. {
  9. return 'index()';
  10. }
  11. public function create()
  12. {
  13. return 'creat()';
  14. }
  15. public function store(Request $request)
  16. {
  17. return 'store()';
  18. }
  19. public function show($id)
  20. {
  21. return 'show()';
  22. }
  23. public function edit($id)
  24. {
  25. return 'edit';
  26. }
  27. public function update(Request $request, $id)
  28. {
  29. return 'update';
  30. }
  31. public function destroy($id)
  32. {
  33. return 'destroy';
  34. }
  35. }

my.php 下添加路由

  1. <?php
  2. /**
  3. * 资源控制器组
  4. * 请求方式 对应方法
  5. * GET index()
  6. * GET cretate()
  7. * POST store()
  8. * GET show()
  9. * GET edit()
  10. * PUT/PATCH update()
  11. * DELETE DELETE
  12. */
  13. Route::namespace('my')->group(function () {
  14. // index()
  15. Route::get('index', 'Resource@index');
  16. // create()
  17. Route::get('create', 'Resource@create');
  18. // store()
  19. Route::post('store', 'Resource@store');
  20. // show()
  21. Route::get('show', 'Resource@show');
  22. // update()
  23. Route::PUT('update', 'Resource@update');
  24. // destroy()
  25. Route::DELETE('destroy', 'Resource@destroy');
  26. });

测试资源方法

index()一需要get请求访问
image.png

create()一需要get请求访问
2.png

store()一需要post请求访问,需要加入白名单
image.png


4. 控制器中间件

先创建一个测试的控制器 php artisan make:controller my/Mid ,并且加入三个方法fun1、fun2、fun3

  1. <?php
  2. namespace App\Http\Controllers\my;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. class Mid extends Controller
  6. {
  7. public function fun1()
  8. {
  9. return '我是fun1()';
  10. }
  11. public function fun2()
  12. {
  13. return '我是fun2()';
  14. }
  15. public function fun3()
  16. {
  17. return '我是fun3()';
  18. }
  19. }

my.php 中添加自定义的路由

  1. <?php
  2. /**
  3. * 控制器中间件
  4. */
  5. Route::namespace('my')->group(function () {
  6. Route::get('fun1', 'Mid@fun1');
  7. Route::get('fun2', 'Mid@fun2');
  8. Route::get('fun3', 'Mid@fun3');
  9. });

4.1 所有方法都使用这个中间件

  1. <?php
  2. // 在构造方法中使用中间件可以有效的控制
  3. public function __construct()
  4. {
  5. // 使用这种方式,所有的方法都走中间件
  6. $this->Middleware('test');
  7. }

4.2 限制哪些方法可以用到这个中间件

  1. <?php
  2. // 在构造方法中使用中间件可以有效的控制
  3. public function __construct()
  4. {
  5. // 限制只有 fun1和fun2方法会使用到中间件
  6. $this->Middleware('test')->only(['fun1','fun2']);
  7. }

4.3 限制哪些方法不可以用到这个中间件

  1. <?php
  2. // 在构造方法中使用中间件可以有效的控制
  3. public function __construct()
  4. {
  5. // 限制只有 fun1和fun2方法会不会使用这个·中间件
  6. $this->Middleware('test')->except(['fun1','fun2']);
  7. }