/** * 执行应用程序 * @access public * @return void */ public static function run() { // 初始化应用(公共模块) self::initModule(COMMON_MODULE, Config::get()); // 读取扩展配置文件 if (Config::get('extra_config_list')) { foreach (Config::get('extra_config_list') as $name => $file) { $file = strpos($file, '.') ? $file : APP_PATH . $file . EXT; Config::load($file, is_string($name) ? $name : pathinfo($file, PATHINFO_FILENAME)); } } // 获取配置参数 $config = Config::get(); // 加载额外文件 if (!empty($config['extra_file_list'])) { foreach ($config['extra_file_list'] as $file) { $file = strpos($file, '.') ? $file : APP_PATH . $file . EXT; if (is_file($file)) { include_once $file; } } } // 设置系统时区 date_default_timezone_set($config['default_timezone']); // 监听app_init APP_HOOK && Hook::listen('app_init'); // 开启多语言机制 if ($config['lang_switch_on']) { // 获取当前语言 defined('LANG_SET') or define('LANG_SET', Lang::range()); // 加载系统语言包 Lang::load(THINK_PATH . 'lang' . DS . LANG_SET . EXT); if (!APP_MULTI_MODULE) { Lang::load(APP_PATH . 'lang' . DS . LANG_SET . EXT); } } // 启动session CLI 不开启 if (!IS_CLI && $config['use_session']) { Session::init($config['session']); } if (empty(self::$dispatch['type'])) { // 未指定调度类型 则进行URL路由检测 self::route($config); } // 监听app_begin APP_HOOK && Hook::listen('app_begin'); // 根据类型调度 switch (self::$dispatch['type']) { case 'redirect': // 执行重定向跳转 header('Location: ' . self::$dispatch['url'], true, self::$dispatch['status']); break; case 'module': // 模块/控制器/操作 $data = self::module(self::$dispatch['module'], $config); break; case 'controller': // 执行控制器操作 $data = Loader::action(self::$dispatch['controller'], self::$dispatch['params']); break; case 'method': // 执行回调方法 $data = self::invokeMethod(self::$dispatch['method'], self::$dispatch['params']); break; case 'function': // 规则闭包 $data = self::invokeFunction(self::$dispatch['function'], self::$dispatch['params']); break; default: throw new Exception('dispatch type not support', 10008); } // 监听app_end APP_HOOK && Hook::listen('app_end', $data); // 输出数据到客户端 return Response::send($data, Response::type(), Config::get('response_return')); }
/** * Dispatch */ protected function dispatch() { $data = []; switch (self::$dispatch['type']) { case 'redirect': header('Location: ' . self::$dispatch['url'], true, self::$dispatch['status']); break; case 'module': $data = self::module(self::$dispatch['module']); break; case 'controller': $data = Loader::action(self::$dispatch['controller'], self::$dispatch['params']); break; case 'method': $data = self::invokeMethod(self::$dispatch['method'], self::$dispatch['params']); break; case 'function': $data = self::invokeFunction(self::$dispatch['function'], self::$dispatch['params']); break; default: throw new KantException('dispatch type not support', 5002); } $this->output($data); }
/** * 执行应用程序 * @access public * @return void */ public static function run() { // 初始化应用(公共模块) self::initModule(COMMON_MODULE, Config::get()); // 获取配置参数 $config = Config::get(); // 注册根命名空间 if (!empty($config['root_namespace'])) { Loader::addNamespace($config['root_namespace']); } // 加载额外文件 if (!empty($config['extra_file_list'])) { foreach ($config['extra_file_list'] as $file) { $file = strpos($file, '.') ? $file : APP_PATH . $file . EXT; if (is_file($file)) { include_once $file; } } } // 设置系统时区 date_default_timezone_set($config['default_timezone']); // 监听app_init APP_HOOK && Hook::listen('app_init'); // 开启多语言机制 if ($config['lang_switch_on']) { // 获取当前语言 defined('LANG_SET') or define('LANG_SET', Lang::range()); // 加载系统语言包 Lang::load(THINK_PATH . 'lang' . DS . LANG_SET . EXT); if (!APP_MULTI_MODULE) { Lang::load(APP_PATH . 'lang' . DS . LANG_SET . EXT); } } if (empty(self::$dispatch['type'])) { // 未指定调度类型 则进行URL路由检测 self::route($config); } // 记录路由信息 APP_DEBUG && Log::record('[ ROUTE ] ' . var_export(self::$dispatch, true), 'info'); // 监听app_begin APP_HOOK && Hook::listen('app_begin'); // 根据类型调度 switch (self::$dispatch['type']) { case 'redirect': // 执行重定向跳转 header('Location: ' . self::$dispatch['url'], true, self::$dispatch['status']); break; case 'module': // 模块/控制器/操作 $data = self::module(self::$dispatch['module'], $config); break; case 'controller': // 执行控制器操作 $data = Loader::action(self::$dispatch['controller'], self::$dispatch['params']); break; case 'method': // 执行回调方法 $data = self::invokeMethod(self::$dispatch['method'], self::$dispatch['params']); break; case 'function': // 规则闭包 $data = self::invokeFunction(self::$dispatch['function'], self::$dispatch['params']); break; default: throw new Exception('dispatch type not support', 10008); } // 监听app_end APP_HOOK && Hook::listen('app_end', $data); // 输出数据到客户端 if (Config::get('response_auto_output')) { // 自动响应输出 return Response::send($data, Response::type(), Config::get('response_return')); } }
<?php define('NET_CLIENT_PATH', __DIR__); require __DIR__ . '/libs/local.php'; include_once NET_CLIENT_PATH . '/libs/loader.php'; if (!empty($argv) && !empty($argv[1])) { $action = $argv[1]; } else { // TODO: Убрать $action = filter_input(INPUT_GET, 'a'); } if (!$action) { return false; } // TODO: Переделать в демона. $local = new Local(); $conn_data = $local->get_connection_data(); $loader = new Loader($local); $loader->load_api($conn_data['key'], $conn_data['domain']); $return = $loader->action($action); if (!empty($return['log'])) { echo 'Action: ' . $action . '(' . date('y-m-d H:i') . ')' . "\n"; echo json_encode($return['log']) . "\n"; }
/** * 执行应用程序 * @access public * @return void */ public static function run() { // 初始化应用(公共模块) self::initModule(COMMON_MODULE, Config::get()); // 读取扩展配置文件 if (Config::get('extra_config_list')) { foreach (Config::get('extra_config_list') as $file) { Config::load($file, $file); } } // 获取配置参数 $config = Config::get(); // 加载额外文件 if (!empty($config['extra_file_list'])) { foreach ($config['extra_file_list'] as $file) { $file = strpos($file, '.') ? $file : APP_PATH . $file . EXT; if (is_file($file)) { include_once $file; } } } // 日志初始化 Log::init($config['log']); // 缓存初始化 Cache::connect($config['cache']); // 设置系统时区 date_default_timezone_set($config['default_timezone']); // 监听app_init APP_HOOK && Hook::listen('app_init'); // 开启多语言机制 if ($config['lang_switch_on']) { // 获取当前语言 defined('LANG_SET') or define('LANG_SET', Lang::range()); // 加载系统语言包 Lang::load(THINK_PATH . 'lang' . DS . LANG_SET . EXT); } // 启动session CLI 不开启 if (!IS_CLI && $config['use_session']) { Session::init($config['session']); } // URL路由检测 $dispatch = self::route($config); // 监听app_begin APP_HOOK && Hook::listen('app_begin', $dispatch); // 根据类型调度 switch ($dispatch['type']) { case 'redirect': // 执行重定向跳转 header('Location: ' . $dispatch['url'], true, $dispatch['status']); break; case 'module': // 模块/控制器/操作 $data = self::module($dispatch['data'], $config); break; case 'action': // 执行操作 $data = Loader::action($dispatch['action'], $dispatch['params']); break; case 'behavior': // 执行行为 $data = Hook::exec($dispatch['class'], $dispatch['method'], $dispatch['params']); break; case 'regex_closure': // 正则闭包 $data = self::invokeRegex($dispatch['closure'], $dispatch['params']); break; case 'rule_closure': // 规则闭包 $data = self::invokeRule($dispatch['closure'], $dispatch['params']); break; default: throw new Exception('dispatch type not support', 10008); } // 监听app_end APP_HOOK && Hook::listen('app_end', $data); // 输出数据到客户端 return Response::send($data, Response::type(), Config::get('response_return')); }
/** * Load components and register hooks with WordPress. * * @since 1.0.0 * @access protected * @return void */ protected function run() { $this->loader->action('plugins_loaded', array($this, 'loadTextDomain')); }
/** * 执行应用程序 * @access public * @return void */ public static function run() { // 初始化应用(公共模块) self::initModule(COMMON_MODULE, Config::get()); // 读取扩展配置文件 if (Config::get('extra_config_list')) { foreach (Config::get('extra_config_list') as $file) { Config::load($file, $file); } } // 获取配置参数 $config = Config::get(); // 加载额外文件 if (!empty($config['extra_file_list'])) { foreach ($config['extra_file_list'] as $file) { $file = strpos($file, '.') ? $file : APP_PATH . $file . EXT; if (is_file($file)) { include_once $file; } } } // 日志初始化 Log::init($config['log']); // 缓存初始化 Cache::connect($config['cache']); // 设置系统时区 date_default_timezone_set($config['default_timezone']); // 监听app_init APP_HOOK && Hook::listen('app_init'); // 开启多语言机制 if ($config['lang_switch_on']) { // 获取当前语言 defined('LANG_SET') or define('LANG_SET', Lang::range()); // 加载系统语言包 Lang::load(THINK_PATH . 'lang' . DS . LANG_SET . EXT); } // 启动session CLI 不开启 if (!IS_CLI && $config['use_session']) { Session::init($config['session']); } if (empty(self::$dispatch['type'])) { // 未指定调度类型 则进行URL路由检测 self::route($config); } // 监听app_begin APP_HOOK && Hook::listen('app_begin'); // 根据类型调度 switch (self::$dispatch['type']) { case 'redirect': // 执行重定向跳转 header('Location: ' . self::$dispatch['url'], true, self::$dispatch['status']); break; case 'module': // 模块/控制器/操作 $data = self::module(self::$dispatch['data'], $config); break; case 'controller': // 执行控制器操作 $data = Loader::action(self::$dispatch['controller'], self::$dispatch['params']); break; case 'callable': // 执行回调方法 $callable = self::$dispatch['callable']; if (is_callable($callable)) { $data = is_array($callable) ? self::reflectionInvoke(new $callable[0](), $callable[1]) : call_user_func_array($callable, self::$dispatch['params']); // 静态方法或者函数 } else { throw new Exception('not callable : ' . (is_array($callable) ? implode('->', $callable) : $callable), 10009); } break; case 'closure': // 规则闭包 $data = self::invoke(self::$dispatch['closure'], self::$dispatch['params']); break; default: throw new Exception('dispatch type not support', 10008); } // 监听app_end APP_HOOK && Hook::listen('app_end', $data); // 输出数据到客户端 return Response::send($data, Response::type(), Config::get('response_return')); }
/** * 执行应用 * @static * @access public */ public static function listen(Request $request = null, $type = 'web') { is_null($request) && ($request = Request::instance()); //请求筛选 \Norma\Hook::trigger('request_action', [$request]); //加载应用独立文件 if (\Norma\Config::has('extra_config_list')) { $extra_config_list = \Norma\Config::get('extra_config_list'); if (is_string($extra_config_list)) { $extra_config_list = explode(',', $extra_config_list); } foreach ($extra_config_list as $key => $file) { \Norma\Config::load(APP_PATH . '/Config/' . $file . '.php'); } } // 设置系统时区 date_default_timezone_set(\Norma\Config::get('default_timezone')); // 应用调试模式 self::$debug = Config::get('app_debug'); if (!self::$debug) { ini_set('display_errors', 'Off'); } else { //重新申请一块比较大的buffer if (ob_get_level() > 0) { $output = ob_get_clean(); } ob_start(); if (!empty($output)) { echo $output; } } // 注册应用实现类名称空间 \Norma\App::$loader->addNamespace(\Norma\Config::get('app_namespace') ?: "App", APP_PATH); // 加载插件 \Norma\Hook::loadPlugin(APP_PATH . '/Plugin', \Norma\Config::get('app_namespace')); // 开启多语言机制 if (\Norma\Config::get('lang_switch_on')) { // 获取当前语言 $request->langset(Lang::detect()); // 加载系统语言包 Lang::load(FRAME_PATH . '/Ability/Lang' . DIRECTORY_SEPARATOR . $request->langset() . '.php'); if (!\Norma\Config::get('app_multi_module')) { Lang::load(APP_PATH . '/Lang' . DIRECTORY_SEPARATOR . $request->langset() . '.php'); } } // 获取应用调度信息 $dispatch = self::$dispatch; if (empty($dispatch)) { // 进行URL路由检测 $dispatch = self::routeCheck($request, \Norma\Config::get()); } // 记录当前调度信息 $request->dispatch($dispatch); // 记录路由信息 //self::$debug && Log::record('[ ROUTE ] ' . var_export($dispatch, true), 'info'); // 监听app_begin //Hook::listen('app_begin', $dispatch); switch ($dispatch['type']) { case 'redirect': // 执行重定向跳转 $data = Response::create($dispatch['url'], 'redirect')->code($dispatch['status']); break; case 'module': // 模块/控制器/操作 $data = self::module($dispatch['module'], \Norma\Config::get(), isset($dispatch['convert']) ? $dispatch['convert'] : null); break; case 'controller': // 执行控制器操作 $data = Loader::action($dispatch['controller'], $dispatch['params']); break; case 'method': // 执行回调方法 $data = self::invokeMethod($dispatch['method'], $dispatch['params']); break; case 'function': // 执行闭包 $data = self::invokeFunction($dispatch['function'], $dispatch['params']); break; case 'response': $data = $dispatch['response']; break; default: throw new \InvalidArgumentException('dispatch type not support'); } // 输出数据到客户端 if ($data instanceof Response) { $response = $data; } elseif (!is_null($data)) { // 默认自动识别响应输出类型 $isAjax = $request->isAjax(); $type = $isAjax ? Config::get('default_ajax_return') : Config::get('default_return_type'); \Norma\Hook::trigger('output', [$data, $type]); } else { \Norma\Hook::trigger('output'); } // //return $response; }