简单说明

在控制器类中设置 beforeActionList 属性来达到目的,这个属性是一个数组,可以继续为每一个元素在此进行限制

表示这些方法不使用前置方法:

  1. <?php
  2. ['except' => '方法名,方法名']

表示只有这些方法使用前置方法:

  1. <?php
  2. ['only' => '方法名,方法名']

测试用例

常见的错误一忘记继承基类

路由:

  1. <?php
  2. use think\facade\Route;
  3. /**
  4. * 对应 test 模块使用的路由定义文件
  5. */
  6. Route::get('test/main', 'test/Prefix/main');

控制器:

  1. <?php
  2. namespace app\test\controller;
  3. class Prefix
  4. {
  5. protected $beforeActionList = [
  6. 'first',
  7. 'second',
  8. 'three',
  9. ];
  10. protected function first()
  11. {
  12. echo 'first <br/>';
  13. }
  14. protected function second()
  15. {
  16. echo 'second <br/>';
  17. }
  18. protected function third()
  19. {
  20. echo 'third <br/>';
  21. }
  22. public function main()
  23. {
  24. echo 'main';
  25. }
  26. }

postman 测试:发现并不是我们想得那样,在访问 main 的时候,一次调用 beforeActionList 属性设置的 first() 、seond()、third() 方法
image.png

正确的使用方式

上面我犯了一个常见的错误,自定义的控制器使用前置操作之前没有去继承基类 \think\Controller.php.

改写一下 控制器:

  1. <?php
  2. use think\Controller;
  3. class Prefix extends Controller
  4. {
  5. // ... ...
  6. protected $beforeActionList = [
  7. 'first',
  8. 'second',
  9. 'third',
  10. ];
  11. // ... ...
  12. }

再次测试:一切都正常了
image.png

使用 only 限制前置操作

控制器:

  1. <?php
  2. protected $beforeActionList = [
  3. 'first' => ['only' => 'go'],
  4. 'second',
  5. 'third',
  6. ];

postman 测试:
image.png

使用 except 限制前置操作

控制器:

  1. <?php
  2. protected $beforeActionList = [
  3. 'first' => ['only' => 'go'],
  4. 'second' => ['except' => 'main'],
  5. 'third',
  6. ];

postman 测试:
image.png