``` <?php // // InitializtionService.php // 请求前初始化控制器服务 // // Created by lijianlin on 2019-06-14. // Copyright 2019 lijianlin. All rights reserved. // namespace app\saas\behavior; use app\common\model\Merror; class InitializtionService { public function run($params) { // 兼容控制器分层,优化控制器目录结构 $controller = request()->controller(); $controllerArray = explode('.', $controller); $controllerLength = count($controllerArray); $appendControllerName = ''; if ($controllerLength == 1) { $appendControllerName = $controllerArray[0]; } else { for ($i = 0; $i < $controllerLength - 1; $i++) { $appendControllerName .= strtolower($controllerArray[$i]) . '\\'; } $appendControllerName .= ucfirst($controllerArray[($controllerLength - 1)]); } // $controller = '\\app\\saas\\controller\\' . request()->controller(); $controller = '\\app\\saas\\controller\\' . $appendControllerName; $verion = request()->param('version'); $init_service = function () use ($controller, $verion, $params) { $reflection = new \ReflectionClass($controller); if (property_exists($controller, 'versions') && isset($reflection->getStaticProperties()['versions'][$verion]) ) { // 默认规则返回,在前在后不允许返回其他信息 $service = $reflection->getStaticProperties()['versions'][$verion]; // 判断控制器服务文件是否存在 return class_exists($service) ? new $service($params['tag'], $params['request']) : Merror::getInstance()->jsonApi(40006); } else { Merror::getInstance()->jsonApi(40001); } }; return is_null($verion) ? Merror::getInstance()->jsonApi(40002) : $init_service(); } } ``` ``` 代码解读 run方法里面有一个参数$params, 该参数是在初始化调用的时候带过来的 ['tag' => $type, 'request' => $request] 默认请求的路由的时候需要带入versoin版本 当存在version的时候,调用匿名函数 $init_service() 该方法做了一下判断: 1、反射该请求类 2、判断请求控制器中是否存在version相对应的服务器层控制器 3、判断服务层控制器是否存在,并实例化该服务层控制器 ```