默认情况下没有使用layout,发现在Bootstarp中始终无法拿到View对象,使用GetResoure的方法,这个方法也是网上一般搜索到的方法,但是我这里打印就是null,今天装好Debug环境,仔细跟踪了下,上截图说事吧:
1:首先从index.php进入,调用Application的run方法
2:application其实是调用的Bootstarp的run方法
3:Front控制器进入dispatch(之前做了很多工作,比如加载插件助手和经纪人助手,这块需要大家仔细了解下)
4:进入分发,这个才是重头戏,之前根据路由找到了对应的路径,然后分发器接着提取到模块名,类名,方法名等(也可能是通过配置文件提取的,也可能额根据路由提取的)
5:找到对应的类之后,要实例化这个类,执行对应的action了。在实例化这个类的时候调用构造函数
6:构造函数中有对经纪人助手的实例化(ViewRender是注册在经纪人助手中的)
7:对经纪人助手实例化,调用构造函数
8:构造函数中调用Viewrender的init方法,init方法内调用initView方法。。这个时候算是实例化了view对象。。
9:接着调用action的自己定义的init方法(这个没截图进去)
10:所以在action的init中是可以拿到view对象的,通过$this->view即可
11:由于这个地方没看到bootstrat的一系列_init的调用所以暂时看不出来时候可以在bootstrat的_initxx方法中提取到这个对象。。
PS1:
下午继续看源代码,在Action的基类中也有对view的初始化,通过对这个方法的引用我看到,是在Action的render中调用了这个方法。这个初始化时直接new出来的Zend_View。传入的参数是baseUrl。这就和上面说的也不冲突,上面的实例化是在经理人助手中,我们知道我们可以显式的不让经纪人助手来拿到ViewRender的,这个也就是干这个用的吧。