ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 控制前前置与后置操作 ### 1、基础控制器修改 因为执行控制器的`callAction`操作,所以可以在继承控制器中改写`callAction`方法 这个方法只适合指定操作控制器的路由,万能路由则不适合此方法 ~~~ /** * 改写父级控制器中的 callAction 用于构建前置与后置操作方法【失败】 */ public function callAction($method, $parameters) { $before = '_before_'.$method; $after = '_after_'.$method; // 前置操作 if(method_exists($this, $before)){ $this->{$before}(...array_values($parameters)); } $result = $this->{$method}(...array_values($parameters)); // 后置操作 if(method_exists($this, $after)){ $this->{$after}(...array_values($parameters)); } return $result; } ~~~ ### 2、万能路由使用 ~~~ Route::group( ['prefix' => 'business'], function() { Route::any( "/{controller}/{action}", function($class, $action) { // 为了配合万能路由 有些驼峰式的控制器采用别名操作 $alias = [ 'classesmember' => 'ClassesMember', 'businessmember' => 'BusinessMember', 'signorgan' => 'SignOrgan', 'signaddress' => 'SignAddress', 'signset' => 'SignSet', 'businessfence' => 'BusinessFence', ]; if(isset($alias[$class])){ $class = $alias[$class]; } // 获取控制器 执行操作 $class = "App\\Http\\Controllers\\Business\\".ucfirst($class).'Controller'; $result = ['code' => 400, 'msg' => '操作文件不存在!',]; if(class_exists($class)){ $controller = \App::make($class); if(method_exists($controller, $action)){ // 前置 后置方法 $before_action = '_prefix_'.$action; // _before_ 已经使用 $after_action = '_after_'.$action; // 前置操作 if(method_exists($controller, $before_action)){ \App::call([$controller, $before_action]); } // 执行控制器 $result = \App::call([$controller, $action]); // 后置操作 if(method_exists($controller, $after_action)){ \App::call([$controller, $after_action]); } } else{ $result = ['code' => 400, 'msg' => '操作方法不存在!',]; } } return $result; } )->where(['module' => '[0-9a-zA-Z]+', 'class' => '[0-9a-zA-Z]+', 'action' => '[0-9a-zA-Z]+']); } ); ~~~