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);

// }

// “共享事件管理器” 还是 “前端的共享事件管理器”

 

posted on 2017-02-10 18:16  周~~  阅读(195)  评论(0编辑  收藏  举报

导航