ayer = 'validate', $appendSuffix = false, $common = 'common') { $name = $name ?: Config::get('default_validate'); if (empty($name)) { return new Validate; } $uid = $name . $layer; if (isset(self::$instance[$uid])) { return self::$instance[$uid]; } list($module, $class) = self::getModuleAndClass($name, $layer, $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); } } return self::$instance[$uid] = $validate; } /** * 解析模块和类名 * @access protected * @param string $name 资源地址 * @param string $layer 验证层名称 * @param bool $appendSuffix 是否添加类名后缀 * @return array */ protected static function getModuleAndClass($name, $layer, $appendSuffix) { if (false !== strpos($name, '\\')) { $module = Request::instance()->module(); $class = $name; } else { if (strpos($name, '/')) { list($module, $name) = explode('/', $name, 2); } else { $module = Request::instance()->module(); } $class = self::parseClass($module, $layer, $name, $appendSuffix); } return [$module, $class]; } /** * 数据库初始化 并取得数据库类实例 * @access public * @param mixed $config 数据库配置 * @param bool|string $name 连接标识 true 强制重新连接 * @return \think\db\Connection */ public static function db($config = [], $name = false) { return Db::connect($config, $name); } /** * 远程调用模块的操作方法 参数格式 [模块/控制器/]操作 * @access public * @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); $action = $info['basename']; $module = '.' != $info['dirname'] ? $info['dirname'] : Request::instance()->controller(); $class = self::controller($module, $layer, $appendSuffix); if ($class) { if (is_scalar($vars)) { if (strpos($vars, '=')) { parse_str($vars, $vars); } else { $vars = [$vars]; } } return App::invokeMethod([$class, $action . Config::get('action_suffix')], $vars); } return false; } /** * 字符串命名风格转换 * type 0 将 Java 风格转换为 C 的风格 1 将 C 风格转换为 Java 的风格 * @access public * @param string $name 字符串 * @param integer $type 转换类型 * @param bool $ucfirst 首字母是否大写(驼峰规则) * @return string */ public static function parseName($name, $type = 0, $ucfirst = true) { if ($type) { $name = preg_replace_callback('/_([a-zA-Z])/', function ($match) { return strtoupper($match[1]); }, $name); return $ucfirst ? ucfirst($name) : lcfirst($name); } return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_")); } /** * 解析应用类的类名 * @access public * @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) { $array = explode('\\', str_replace(['/', '.'], '\\', $name)); $class = self::parseName(array_pop($array), 1); $class = $class . (App::$suffix || $appendSuffix ? ucfirst($layer) : ''); $path = $array ? implode('\\', $array) . '\\' : ''; return App::$namespace . '\\' . ($module ? $module . '\\' : '') . $layer . '\\' . $path . $class; } /** * 初始化类的实例 * @access public * @return void */ public static function clearInstance() { self::$instance = []; } } // 作用范围隔离 /** * include * @param string $file 文件路径 * @return mixed */ function __include_file($file) { return include $file; } /** * require * @param string $file 文件路径 * @return mixed */ function __require_file($file) { return require $file; }