dispatch(); if (isset($dispatch['var']) && $dispatch['var']) { $request->route(array_diff_key($dispatch['var'], array_flip(['addon', 'controller', 'action']))); } // 设置当前请求的控制器、操作 $request->controller($controller)->action($action); // 监听addon_module_init Hook::listen('addon_module_init', $request); // 兼容旧版本行为,即将移除,不建议使用 Hook::listen('addons_init', $request); $class = get_addon_class($addon, 'controller', $controller); if (!$class) { throw new HttpException(404, __('addon controller %s not found', Loader::parseName($controller, 1))); } $instance = new $class($request); $vars = []; if (is_callable([$instance, $action])) { // 执行操作方法 $call = [$instance, $action]; } elseif (is_callable([$instance, '_empty'])) { // 空操作 $call = [$instance, '_empty']; $vars = [$action]; } else { // 操作不存在 throw new HttpException(404, __('addon action %s not found', get_class($instance) . '->' . $action . '()')); } Hook::listen('addon_action_begin', $call); return call_user_func_array($call, $vars); } else { abort(500, lang('addon can not be empty')); } } }