- Yii 应用的静态结构
应用:
- require可以有返回值,Yii中经常返回数组用以配置。以前只知道引用文件成功返回1。
controllerMap属性允许你指定一个控制器ID到任意控制器类,修改配置文件: 'controllerMap'=>[ 'site'=>'app\controllers\SiteonionController', ], 控制器Site就对应到控制器类:app\controllers\SiteonionController
- name属性指定你可能想展示给终端用户的应用名称,如果其他地方的代码没有用到,可以不配置该属性。'name' => 'xxxx’,咦去哪了呢在哪能看到?,在调试器里面看到了:
- \Yii::$app可以访问这些数据,也可修改,\Yii:$app是左值。(应用主体在 入口脚本 中创建并能通过表达式
\Yii::$app
全局范围内访问,应用主体是管理 Yii 应用系统整体结构和生命周期的对象。)var_dump(\Yii::$app); //访问所有对象和属性 echo \Yii::$app->name.'<br/>'; //访问上面添加的name,输出:卢西恩.佛洛伊德生于1922年… \Yii::$app->name='维果斯基(Lev Vygotsky,1896-1934)亦有翻译为维果茨基,前苏联心理学家,“文化-历史”理论的创始人。';//修改name变量 echo \Yii::$app->name.'<br/>'; //修改后的,输出:维果斯基… echo \Yii::$app->params['adminEmail'].'<br/>'; //访问params.php文件返回的数组$params中的adminEmail配置。 因为web.php顶部默认取$params = require(__DIR__ . '/params.php');
-
timeZone设置时区
echo 'default zone('.\Yii::$app->timeZone.'):'.date('Y-m-d H:i:s',time()).'<br/>'; \Yii::$app->timeZone='Asia/Shanghai'; echo 'now zone('.\Yii::$app->timeZone.'):'.date('Y-m-d H:i:s',time()).'<br/>'; /* 输出 default zone(Europe/Paris):2016-12-14 06:55:46 //默认时区是Paris可能是apache问题 now zone(Asia/Shanghai):2016-12-14 13:55:46 */
-
layout布局路径和layoutPath视图路径,yii\base\Application::layout 属性指定渲染视图默认使用的布局名字, yii\base\Application::layoutPath 属性指定查找布局文件的路径,默认为@app/views/layouts/main.php 文件 修改配置文件:
'layout'=>'mainview', 'layoutPath'=>'@app/views/onion',
就使用@app/views/onion/mainview.php 文件渲染视图。p.s.视图路径也是可以更改的(yii\base\Application::viewPath 路径指定视图文件的根目录,默认值为带别名的 @app/views)
-
on beforeRequest (应用事件),应用在处理请求过程中会触发事件,例如把上一篇文章的paths()函数放这里,来输出到控制台
function paths(){ $pathsarr=array( '当前请求的 Host:'=>$_SERVER["HTTP_HOST"], '请求执行文件的相对地址:'=>$_SERVER["PHP_SELF"], '实际执行文件相对地址:'=>$_SERVER["SCRIPT_NAME"], '实际执行文件的绝对路径:'=>$_SERVER["SCRIPT_FILENAME"], '实际执行代码的绝对路径:'=>__FILE__, 'url请求中包括/和之后的所有内容:'=>$_SERVER["REQUEST_URI"], 'url请求中?之后的内容:'=>$_SERVER["QUERY_STRING"], '文档根目录:'=>$_SERVER["DOCUMENT_ROOT"], '请求执行文件的的文件名:'=>basename($_SERVER["PHP_SELF"]), '实际执行文件的文件名:'=>basename($_SERVER["SCRIPT_NAME"]), '实际执行文件的文件名:'=>basename($_SERVER["SCRIPT_FILENAME"]), '实际执行代码的文件名:'=>basename(__FILE__), '请求执行文件的的所在目录:'=>dirname($_SERVER["PHP_SELF"]), '实际执行文件的所在目录:'=>dirname($_SERVER["SCRIPT_NAME"]), '实际执行文件的所在目录:'=>dirname($_SERVER["SCRIPT_FILENAME"]), '实际执行代码的所在目录:'=>dirname(__FILE__), 'dir(同↑):'=>__DIR__ ); return $pathsarr; } ...... if (YII_ENV_DEV) { $config['on beforeRequest']=function ($event){ $pathtemp=paths(); foreach($pathtemp as $k=>$v){ $v=str_replace("\\","\\\\",$v);//反斜杠\,在console里没有显示,转换成\\显示 echo "<script>console.log('{$k}{$v}')</script>"; } }; ......
放到if(YII_ENV_DEV)下,意图旨在开发环境下再输出显示:
-
应用主体生命周期
p.s. Register error handler,我以为就是注册错误句柄,搜了一下handler,发现(handler和句柄完全不是一回事,句柄的英文是handle,handler是处理程序的意思),再结合手册中的,这里确实应该是处理程序。Handle Request则用了处理(handle)。当运行 入口脚本 处理请求时, 应用主体会经历以下生命周期:
- 入口脚本加载应用主体配置数组。
- 入口脚本创建一个应用主体实例:
- 调用 yii\base\Application::preInit() 配置几个高级别应用主体属性, 比如yii\base\Application::basePath。
- 注册 yii\base\Application::errorHandler 错误处理方法.
- 配置应用主体属性.
- 调用 yii\base\Application::init() 初始化, 该函数会调用 yii\base\Application::bootstrap() 运行引导启动组件.
- 入口脚本调用 yii\base\Application::run() 运行应用主体:
- 触发 yii\base\Application::EVENT_BEFORE_REQUEST 事件。
- 处理请求:解析请求 路由 和相关参数; 创建路由指定的模块、控制器和动作对应的类,并运行动作。
- 触发 yii\base\Application::EVENT_AFTER_REQUEST 事件。
- 发送响应到终端用户.
- 入口脚本接收应用主体传来的退出状态并完成请求的处理。 by http://www.yiichina.com/doc/guide/2.0/structure-applications