ZendFramework-2.4 源代码 - 框架事件驱动整体模型,前端全局事件管理器,控制器事件管理器
框架事件驱动整体模型
----------step.1---------------- loadModules --> for(){ loadModule.resolve --> loadModule } --> mergeConfig --> loadModules.post -----------step.2--------------- {{ ---> bootstrap case_1:---> route ---> finish case_2:---> route ---> dispatch.0 ---> dispatch.1 ---> finish ---> sendResponse case_3:---> route ---> dispatch.0 ---> dispatch.1 ---> render ---> renderer ---> renderer.post ---> response ---> finish ---> sendResponse }}
前端全局事件管理器
// Zend\EventManager\EventManager(前端的事件管理器) { // DefaultListenerAggregate / $application['module_listener_options'] { // ----------------------step.1------------------------------ // Zend\ModuleManager\Listener\ModuleLoaderListener array('event'=>'loadModules','callback'=>array(new ModuleAutoloader($application['module_listener_options']['ModulePaths']), 'register'),'priority'=>9000); // loadModules__0 // 监听器实现:注册“模块加载器” spl_autoload_register, array('./module','./vendor') if($application['module_listener_options']['ModuleMapCacheEnabled'] && $application['module_listener_options']['ModuleMapCacheFile']){ // 如果有配置缓存 array('event'=>'loadModules.post','callback'=>array($this, 'onLoadModulesPost'),'priority'=>1); // loadModules.post__0 // 取消注册“模块加载器”、把所有模块的加载路径信息写入缓存 $application['module_listener_options']['ModuleMapCacheFile']、$application['module_listener_options']['ModulePaths'] } // Zend\ModuleManager\Listener\ModuleResolverListener array('event'=>'loadModule.resolve','callback'=>new ModuleResolverListener,'priority'=>1); // loadModule.resolve__0 // 监听器实现:创建模块对象 new '$moduleName\Module'; // Zend\ModuleManager\Listener\AutoloaderListener array('event'=>'loadModule','callback'=>new AutoloaderListener($application['module_listener_options']),'priority'=>9000); // loadModule---0 // 监听器实现: Album\Module::getAutoloaderConfig() 获取“模块内部加载器”配置,创建并注册“模块内部加载器” spl_autoload_register // Zend\ModuleManager\Listener\ModuleDependencyCheckerListener if($application['module_listener_options']['CheckDependencies']){ array('event'=>'loadModule','callback'=>new ModuleDependencyCheckerListener,'priority'=>8000); // loadModule---1 // 监听器实现:如果模块实现DependencyIndicatorInterface接口,那么就检查模块的依赖 } // Zend\ModuleManager\Listener\InitTrigger array('event'=>'loadModule','callback'=>new InitTrigger($application['module_listener_options']),'priority'=>1); // loadModule---2 // 监听器实现: Album\Module::init($moduleManager) 初始化 // Zend\ModuleManager\Listener\OnBootstrapListener array('event'=>'loadModule','callback'=>new OnBootstrapListener($application['module_listener_options']),'priority'=>1); // loadModule---3 // 监听器实现:Album\Module::onBootstrap() 注册事件“bootstrap”的监听器到共享事件管理器 Album\Module::onLoadModule() // Zend\ModuleManager\Listener\LocatorRegistrationListener array('event'=>'loadModule','callback'=>array($this, 'onLoadModule'),'priority'=>1); // loadModule---4 // 监听器实现:模块如果实现 LocatorRegisteredInterface 接口,那么把“模块对象”注入自己内部 $this->modules[] = $e->getModule(); array('event'=>'loadModules','callback'=>array($this, 'onLoadModules'),'priority'=>-1000); // loadModules__3 // 监听器实现:注册事件 bootstrap 的监听器到共享事件管理器 // Zend\ModuleManager\Listener\ConfigListener array('event'=>'loadModules','callback'=>array($this, 'onloadModulesPre'),'priority'=>1000); // loadModules__1 // 监听器实现:给 ModuleEvent注入自己 $e->setConfigListener($this); if(!($application['module_listener_options']['ConfigCacheEnabled'] && $application['module_listener_options']['ConfigCacheFile'])){ // 还没有缓存或者没有配置缓存 array('event'=>'loadModule','callback'=>array($this, 'onLoadModule'),'priority'=>1); // loadModule---5 // 监听器实现: 获取模块的配置 $configListener->configs['album'] = Album\Module::getConfig() array('event'=>'loadModules','callback'=>array($this, 'onLoadModules'),'priority'=>-1000); // loadModules__4 // 监听器实现:触发事件'mergeConfig',并生成配置缓存文件 array('event'=>'mergeConfig','callback'=>array($this, 'onMergeConfig'),'priority'=>1000); // mergeConfig__0 // 监听器实现: 根据$application['module_listener_options']['ConfigGlobPaths']/$application['module_listener_options']['ConfigStaticPaths']读取合并后的配置文件 } // } // Zend\ModuleManager\Listener\ServiceListener / $application['service_listener_options'] { array('event'=>'loadModule','callback'=>array($this, 'onLoadModule'),'priority'=>1); // loadModule---6 // 监听器实现:for( 迭代$this->serviceManagers) { 检查模块album是否实现了serviceManager声明的接口和方法,若是,那么调用album方法获取serviceManager的配置,并把配置注入$this->serviceManagers[$key]['configuration'][$e->getModuleName() . '::' . $this->serviceManagers[$key]['module_class_method'] . '()'] = $module->{$this->serviceManagers[$key]['module_class_method']}(); } array('event'=>'loadModules.post','callback'=>array($this, 'onLoadModulesPost'),'priority'=>1); // loadModules.post__1 // 监听器实现:for( 迭代$this->serviceManagers) { 根据serviceManager配置:获取config_key的配置值、合并配置、实例化service_manager、把合并的配置注入service_manager,(new ServiceConfig(for($this->serviceManagers[$key]['configuration']){ArrayUtils::merge($configListener->getMergedConfig(false)[$this->serviceManagers[$key]['config_key']],...)}))->configureServiceManager($sm['service_manager']); } // } // Zend\ModuleManager\ModuleManager / $application['modules'] { array('event'=>'loadModules','callback'=>array($this, 'onLoadModules'),'priority'=>1); // loadModules__2 // 监听器实现:for(迭代$application['modules']){ 1.触发“loadModule.resolve”事件,2.触发“loadModule”事件 } // } // ----------------------step.2------------------------------ // Zend\Mvc\RouteListener array('event'=>'route','callback'=>array($this, 'onRoute'),'priority'=>1); // route---1,匹配路由,若没有匹配到,触发 'dispatch.error' 事件 // Zend\Mvc\DispatchListener array('event'=>'dispatch','callback'=>array($this, 'onDispatch'),'priority'=>1); // dispatch...0,监听器实现的功能:创建控制器对象,调用控制器对象的 dispatch 方法,触发事件'dispatch' if (function_exists('zend_monitor_custom_event_ex')) { array('event'=>'dispatch.error','callback'=>array($this, 'reportMonitorEvent'),'priority'=>1); // dispatch.error ### 0 } // Zend\Mvc\HttpMethodListener // $application['module_listener_options']['ExtraConfig']['http_methods_listener'] = array('allowed_methods'=>array('DELETE','GET','POST','PUT'),'enabled'=>true); if ($this->isEnabled()) { array('event'=>'route','callback'=>array($this, 'onRoute'),'priority'=>10000); // route---0 // 监听器实现:请求方法检查 } // Zend\Mvc\View\Http\ViewManager { // 1、http的支持 Zend\Mvc\View\Http\ViewManager array('event'=>'bootstrap','callback'=>array($this, 'onBootstrap'),'priority'=>10000); // {{ bootstrap___0 // 监听器实现:创建关于视图的对象,添加其他事件处理器 // Zend\View\Strategy\PhpRendererStrategy array('event'=>'renderer','callback'=>array($this, 'selectRenderer'),'priority'=>1); // renderer *** 0 // 监听器实现:返回渲染器对象 array('event'=>'response','callback'=>array($this, 'injectResponse'),'priority'=>1); // response >>> 0 // 监听器实现:把渲染的内容设置到 response中,$response->setContent($result); // $services->get('Config')['view_manager']['mvc_strategies'] = array('mvc_strategies_0','mvc_strategies_1'); // $mvcStrategy = $services->get('Config')['view_manager']['mvc_strategies'][$i] // $application->getEventManager() // $listener = $services->get($mvcStrategy); if ($listener instanceof ListenerAggregateInterface) { $events->attach($listener, 100); } array('event'=>'xxx','callback'=>array($this, 'xxx'),'priority'=>100); // $services->get('Config')['view_manager']['strategies'] = array('strategies_0','strategies_1'); // $strategy = $services->get('Config')['view_manager']['strategies'][$i] // $ViewManager->getView()->getEventManager() // $listener = $services->get($strategy); if ($listener instanceof ListenerAggregateInterface) { $view->getEventManager()->attach($listener, 100); } array('event'=>'xxx','callback'=>array($this, 'xxx'),'priority'=>100); // Zend\Mvc\View\Http\RouteNotFoundStrategy array('event'=>'dispatch','callback'=>array($this, 'prepareNotFoundViewModel'),'priority'=>-90); // dispatch...2_0 array('event'=>'dispatch.error','callback'=>array($this, 'detectNotFoundError'),'priority'=>1); // dispatch.error ### 1 array('event'=>'dispatch.error','callback'=>array($this, 'prepareNotFoundViewModel'),'priority'=>1); // dispatch.error ### 2 // Zend\Mvc\View\Http\ExceptionStrategy array('event'=>'dispatch.error','callback'=>array($this, 'prepareExceptionViewModel'),'priority'=>1); // dispatch.error ### 3 array('event'=>'render.error','callback'=>array($this, 'prepareExceptionViewModel'),'priority'=>1); // render.error --*-- 0 // Zend\Mvc\View\Http\InjectViewModelListener array('event'=>'dispatch.error','callback'=>array($this, 'injectViewModel'),'priority'=>-100);// dispatch.error ### 4 array('event'=>'render.error','callback'=>array($this, 'injectViewModel'),'priority'=>-100); // render.error --*-- 1 // Zend\Mvc\View\Http\DefaultRenderingStrategy array('event'=>'render','callback'=>array($this, 'render'),'priority'=>-10000); // render ==*== 0 array('event'=>'render.error','callback'=>array($this, 'render'),'priority'=>-10000); // render.error --*-- 2 // }} // }------ 或者 ------ // 2、console 的支持 Zend\Mvc\View\Console\ViewManager { array('event'=>'bootstrap','callback'=>array($this, 'onBootstrap'),'priority'=>10000); // {{ bootstrap___0 监听器实现: // $services->get('Config')['view_manager']['mvc_strategies'] // $application->getEventManager() // if ($listener instanceof ListenerAggregateInterface) { $events->attach($listener, 100); } array('event'=>'xxx','callback'=>array($this, 'xxx'),'priority'=>100); // $services->get('Config')['view_manager']['strategies'] // $ViewManager->getView()->getEventManager() // if ($listener instanceof ListenerAggregateInterface) { $view->getEventManager()->attach($listener, 100); } array('event'=>'xxx','callback'=>array($this, 'xxx'),'priority'=>100); // Zend\Mvc\View\Console\RouteNotFoundStrategy array('event'=>'dispatch.error','callback'=>array($this, 'handleRouteNotFoundError'),'priority'=>1); // Zend\Mvc\View\Console\ExceptionStrategy array('event'=>'dispatch.error','callback'=>array($this, 'prepareExceptionViewModel'),'priority'=>1); array('event'=>'render.error','callback'=>array($this, 'prepareExceptionViewModel'),'priority'=>1); // Zend\Mvc\View\Console\InjectViewModelListener array('event'=>'dispatch.error','callback'=>array($this, 'injectViewModel'),'priority'=>-100); array('event'=>'render.error','callback'=>array($this, 'injectViewModel'),'priority'=>-100); // Zend\Mvc\View\Console\DefaultRenderingStrategy array('event'=>'render','callback'=>array($this, 'render'),'priority'=>-10000); // }} // } // Zend\Mvc\SendResponseListener { array('event'=>'finish','callback'=>array($this, 'sendResponse'),'priority'=>-10000); // finish...0 监听器实现:触发事件sendResponse array('event'=>'sendResponse','callback'=>array(new Zend\Mvc\ResponseSender\PhpEnvironmentResponseSender, '__invoke'),'priority'=>-1000); array('event'=>'sendResponse','callback'=>array(new Zend\Mvc\ResponseSender\ConsoleResponseSender, '__invoke'),'priority'=>-2000); array('event'=>'sendResponse','callback'=>array(new Zend\Mvc\ResponseSender\SimpleStreamResponseSender, '__invoke'),'priority'=>-3000); array('event'=>'sendResponse','callback'=>array(new Zend\Mvc\ResponseSender\HttpResponseSender, '__invoke'),'priority'=>-4000); // } // } // 共享事件管理器 // 'Zend\EventManager\SharedEventManager' : { // 'identifiers' : { // ----------------------step.1------------------------------ // 'Zend\Mvc\Application' : { // 'EventManage' : { // 'identifiers' : ['Zend\Mvc\Application'], // 'events' : { // OnBootstrapListener array('event'=>'bootstrap','callback'=>array('Album\Module\Album', 'onLoadModule'),'priority'=>1); // bootstrap___3 // LocatorRegistrationListener array('event'=>'bootstrap','callback'=>function ($e) use ($moduleManager) { },'priority'=>1000); // bootstrap___2 给模块设置别名 $services->setAlias(get_class($moduleManager), end(explode('\\', $moduleClassName))); if (0 !== count($this->modules)) { array('event'=>'bootstrap','callback'=>array($this, 'onBootstrap'),'priority'=>1000); } // } // } // }, // ----------------------step.2------------------------------ // 'Zend\Stdlib\DispatchableInterface' : { // 'EventManage' : { // 'identifiers' : ['Zend\Stdlib\DispatchableInterface'], // 'events' : { // http 请求的事件处理器 {{ 在“控制器”中触发'dispatch'事件的时候会执行到 array('event'=>'dispatch','callback'=>array(new Zend\Mvc\View\Http\CreateViewModelListener, 'createViewModelFromArray'),'priority'=>-80); // dispatch...1_0,监听器实现:若控制器方法的返回值是数组类型,那么包装成ViewModel对象 array('event'=>'dispatch','callback'=>array(new Zend\Mvc\View\Http\RouteNotFoundStrategy, 'prepareNotFoundViewModel'),'priority'=>-90); // dispatch...2_1,监听器实现:若返回值是404,那么拦截并注入相关信息 array('event'=>'dispatch','callback'=>array(new Zend\Mvc\View\Http\CreateViewModelListener, 'createViewModelFromNull'),'priority'=>-80); // dispatch...1_1,监听器实现:若控制器方法的返回值是null,那么包装成ViewModel对象 array('event'=>'dispatch','callback'=>array(new Zend\Mvc\View\Http\InjectTemplateListener, 'injectTemplate'),'priority'=>-90); // dispatch...2_2,监听器实现:若返回的对象中没有模板信息,那么拦截并注入相关信息 array('event'=>'dispatch','callback'=>array(new Zend\Mvc\View\Http\InjectViewModelListener, 'injectViewModel'),'priority'=>-100); // dispatch...3,监听器实现:创建viewModel对象,并若控制器方法的返回值,设置为新创建对象的属性 // }} // ------ 或者 ------ // console 请求的事件处理器 {{ array('event'=>'dispatch','callback'=>array(new Zend\Mvc\View\Console\InjectNamedConsoleParamsListener, 'injectNamedParams'),'priority'=>1000); array('event'=>'dispatch','callback'=>array(new Zend\Mvc\View\Console\CreateViewModelListener, 'createViewModelFromArray'),'priority'=>-80); array('event'=>'dispatch','callback'=>array(new Zend\Mvc\View\Console\CreateViewModelListener, 'createViewModelFromString'),'priority'=>-80); array('event'=>'dispatch','callback'=>array(new Zend\Mvc\View\Console\CreateViewModelListener, 'createViewModelFromNull'),'priority'=>-80); array('event'=>'dispatch','callback'=>array(new Zend\Mvc\View\Console\InjectViewModelListener, 'injectViewModel'),'priority'=>-100); // }} // } // } // }, // } // }
控制器事件管理器
// Zend\EventManager\EventManager(控制器中的事件管理器) { // Zend\Mvc\Controller\AbstractController array('event'=>'dispatch' ,'callback'=>array($this, 'onDispatch'),'priority'=>1); // } // “共享事件管理器” 还是 “前端的共享事件管理器”