/** * 实例化(分层)模型 * @param string $name Model名称 * @param string $layer 业务层名称 * @param bool $appendSuffix 是否添加类名后缀 * @param string $common 公共模块名 * @return Object * @throws ClassNotFoundException */ public static function model($name = '', $layer = 'model', $appendSuffix = false, $common = 'common') {// this is get model // 获取对应的信息 if (isset(self::$instance[$name . $layer])) { return self::$instance[$name . $layer]; }// 不同的 层 跟 不同的 名字 就可以确定 不同的 model // 对应到 不同的 key if (strpos($name, '/')) {// 如果你的名字不纯洁 那么就要处理你 list($module, $name) = explode('/', $name, 2);//默认给到的 就是 list 方式 } else { $module = Request::instance()->module();// 否则 应该会自动加载了,这个位置,不是初始化调用的地方 } $class = self::parseClass($module, $layer, $name, $appendSuffix);// 获取到对应的 类 名 , this class name if (class_exists($class)) {// 找到的这个class变量,如果是个 class 的话,就使用他 $model = new $class(); // 好用法 } else { $class = str_replace('\\' . $module . '\\', '\\' . $common . '\\', $class);// 再次处理 这个 class if (class_exists($class)) {// 如果可以了 $model = new $class();// 执行他 } else {// 否则的话 抛出 类 异常 // 这里可以补充一下, 其实应该是 model class not exists: throw new ClassNotFoundException('class not exists:' . $class, $class); } } self::$instance[$name . $layer] = $model;// 存入 key value 关键字 return $model;// 返回 数据 } /** * 实例化(分层)控制器 格式:[模块名/]控制器名 * @param string $name 资源地址 * @param string $layer 控制层名称 * @param bool $appendSuffix 是否添加类名后缀 * @param string $empty 空控制器名称 * @return Object|false * @throws ClassNotFoundException */ public static function controller($name, $layer = 'controller', $appendSuffix = false, $empty = '') { // 第一步: 获取对应的 model // 通过 不同的 方式 1 // 方式2 if (strpos($name, '/')) { list($module, $name) = explode('/', $name); } else { $module = Request::instance()->module(); } // 第二步: 获取 class $class = self::parseClass($module, $layer, $name, $appendSuffix); // 第三步:对获取的class 进行 验证,存在,就 if (class_exists($class)) { return new $class(Request::instance());// 返回 } elseif ($empty && class_exists($emptyClass = self::parseClass($module, $layer, $empty, $appendSuffix))) { return new $emptyClass(Request::instance());// 返回空的 // 看来进步了,没有报错,哈哈 } } /** * 实例化验证类 格式:[模块名/]验证器名 * @param string $name 资源地址 * @param string $layer 验证层名称 * @param bool $appendSuffix 是否添加类名后缀 * @param string $common 公共模块名 * @return Object|false * @throws ClassNotFoundException */ public static function validate($name = '', $layer = 'validate', $appendSuffix = false, $common = 'common') {// 进行验证,验证类型: // 名字 层名字 前缀 $name = $name ?: Config::get('default_validate');// 获取验证规则 地址 if (empty($name)) {// empty $name 如果文件为空,直接返回 return new Validate;// 新的 验证类 Validate 新的验证类 } if (isset(self::$instance[$name . $layer])) {// 存在就直接返回 return self::$instance[$name . $layer]; }// 如果已经 验证了 if (strpos($name, '/')) {// list($module, $name) = explode('/', $name); } else { $module = Request::instance()->module(); } // 获取类 $class = self::parseClass($module, $layer, $name, $appendSuffix); if (class_exists($class)) {// 如果类存在 $validate = new $class;// 生成 新类 } else { $class = str_replace('\\' . $module . '\\', '\\' . $common . '\\', $class);// 如果 获取类 if (class_exists($class)) { $validate = new $class;// 返回新 类 } else { throw new ClassNotFoundException('class not exists:' . $class, $class); } }// 你懂的 类不存在了 self::$instance[$name . $layer] = $validate;// 存档 备查询 return $validate; } /** * 数据库初始化 并取得数据库类实例 * @param mixed $config 数据库配置 * @param bool|string $name 连接标识 true 强制重新连接 * @return \think\db\Connection */ public static function db($config = [], $name = false) { return Db::connect($config, $name); }// 数据库 初始化 并取得 数据库 实例 /** * 远程调用模块的操作方法 参数格式 [模块/控制器/]操作 * @param string $url 调用地址 * @param string|array $vars 调用参数 支持字符串和数组 * @param string $layer 要调用的控制层名称 * @param bool $appendSuffix 是否添加类名后缀 * @return mixed */ public static function action($url, $vars = [], $layer = 'controller', $appendSuffix = false) { $info = pathinfo($url);// 获取 url 地址信息 $action = $info['basename'];// 获取 action 方式 $module = '.' != $info['dirname'] ? $info['dirname'] : Request::instance()->controller(); // 获取 中间值 module $class = self::controller($module, $layer, $appendSuffix);// 获取 class 名称 if ($class) {// 如果存在 class if (is_scalar($vars)) {// 如果是标准量 if (strpos($vars, '=')) {// strpos parse_str($vars, $vars);// 解析字符串 } else { $vars = [$vars];// 这个强转换 漂亮 } } return App::invokeMethod([$class, $action . Config::get('action_suffix')], $vars); }//return App:: 验证文件是否存在 } /** * 字符串命名风格转换 * type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格 * @param string $name 字符串 * @param integer $type 转换类型 * @return string */ public static function parseName($name, $type = 0) {// 转换字符串 风格的 一个小函数,如果1 就大写,否则就小写 if ($type) { return ucfirst(preg_replace_callback('/_([a-zA-Z])/', function ($match) { return strtoupper($match[1]); }, $name)); } else { return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_")); } } /** * 解析应用类的类名 * @param string $module 模块名 * @param string $layer 层名 controller model ... * @param string $name 类名 * @param bool $appendSuffix * @return string */ public static function parseClass($module, $layer, $name, $appendSuffix = false) {// 解析 Class 类名 $name = str_replace(['/', '.'], '\\', $name);// 替换类名 $array = explode('\\', $name);// 解析类资源 $class = self::parseName(array_pop($array), 1) . (App::$suffix || $appendSuffix ? ucfirst($layer) : ''); $path = $array ? implode('\\', $array) . '\\' : ''; return App::$namespace . '\\' . ($module ? $module . '\\' : '') . $layer . '\\' . $path . $class; }// 解析 类名 /** * 初始化类的实例 * @return void */ public static function clearInstance() { self::$instance = []; }// 初始化,就是 清空实例
[李景山php]每天TP5-20161207|Loader.php-5
原创lijingsan1 博主文章分类:php ©著作权
©著作权归作者所有:来自51CTO博客作者lijingsan1的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章