Yii学习笔记1-介绍和详细运行过程

来源:互联网 发布:mac翻墙代理软件 编辑:程序博客网 时间:2024/05/24 04:55
一.Yii介绍:
1.Yii是一个高性能的,基于组件的PHP框架。总的来说Yii具有以下特性:
1)使用了MVC模式;
2)提供了数据库查询生成器和Active Record;
3)与Jquery整合;
4)表单输入和验证;
5)身份验证和授权;
6)支持主题设置;
7)国际化和本地化;
8)分层缓存方案;
9)错误处理和日志记录;
10)系统安全方案;
11)完全面向对象;
12)友好的支持第三方代码库;
13)扩展库
2.因为基于组件的框架结构和设计精巧的的缓存支持,所以特别适合大型应用的开发。
3.Yii建议使用PSR标准规范:
1)PHP代码必须以<?php 或 <?=开头;
2)PHP文件必须是不到BOM的UTF-8编码文件;
3)PHP的类名符合大驼峰命名规则;
4)PHP的方法名称符合小驼峰命名规则;
5)PHP类的加载需要有命名空间;
6)PHP的所有常量需要以大写字母命名。
4.Yii2.0使用的新概念
1)命名空间:命名空间是一种定义事物的方法,是为了解决类名冲突、提高源代码可读性;
2)匿名函数:也叫闭包函数,一个没有指定名称的临时函数;
3)数组命名[] 取代 array();
4)输出方式<?=替代echo
5)SPL 类和接口
6)后期静态绑定:static::不再解析为定义当前方法所在的类,而是在实际运行时计算的;
7)Trait:是PHP的一种代码复用的方法,为了减少单继承方式的限制。


二.Yii的一次运行过程
第一步:框架初始化,包括设置项目路径、加载自动装载文件、引入初始化文件。
第二步:实例化Application应用类,包括:
设置Yii::$app变量,$app就是Application的对象;
初始配置,basePath、vendorPath、runtimePath、timeZone、组件配置;
注册错误管理方法,注册配置的errorHandler(系统错误处理yii\web\ErrorAction);
初始化属性,组件已经放到config,Component::__construct($config)会把配置设置成Application属性,
而调用Application属性时
调用init方法,执行配置的bootstrap(引导程序),debug的引导程序添加了beforeRequest和endBody事件。
第三步:执行run,触发beforeRequest过滤器;
第四步:调用请求管理,解析路由"r"后面的参数值;
第五步:调用请求管理,创建控制器,根据rote和controllerNamespace组合控制器类名,调用时触发BaseYii.php的autoload
app别名组合对应的*.php的文件并引入;
第六步:创建控制器后调用action,action前后分别指向beforeAction、afterAction;
第七步:调用action完成后,触发afterRequest过滤器。



三.Yii详细运行过程
1.初始化框架环境变量,例如:debug模式(YII_DEBUG)、环境(YII_ENV)、项目路径(WEB_PATH);
2.引入自动装载文件,自动装载包含以下逻辑:
1)加载ClassLoader.php文件(为了加载这个文件,autoload注册又释放感觉多次一举,直接加载更好);
2)php5.6以上需要回调getInitializer返回的函数;
3)引入autoload_namespaces.php,设置到$loader->prefixesPsr0 ;
4)引入autoload_psr4.php,设置到$loader->prefixDirsPsr4 ;
5)引入autoload_classmap.php,设置到$loader->classMap ;
6)注册自动装载函数:spl_autoload_register(array($this, 'loadClass'), true, $prepend); ;
7)自动状态函数loadClass逻辑(......优先Yii.php中的autoload......):
第一步:如果存在classMap,类名和文件的映射关系,则直接引入映射的文件,优先级最高;
第二步:如果autoload_psr4.php配置映射出的路径,file存在,则引入;
第三步:如果autoload_namespaces.php配置映射出的路径,文件存在,则引入;
......
8)特别注意:...yii2/Yii.php中有spl_autoload_register(['Yii', 'autoload'], true, true);
第一步:Yii::$classMap的值是yii2/classes.php返回的映射数组;
第二步:如果调用的文件在映射数组中则直接引入;
第三步:如果包含\则在前面加上@,\替换为/
第四步:static::getAlias()经过别名获取文件 
第五步:如果文件存在就引入文件,否则直接返回
注:默认设置变量public static $aliases = ['@yii' => __DIR__];
在Application.php设置了:
Yii::setAlias('@app', $this->getBasePath());
Yii::setAlias('@runtime', $this->_runtimePath);
Yii::setAlias('@vendor', $this->_vendorPath);
Yii::setAlias('@bower', $this->_vendorPath . DIRECTORY_SEPARATOR . 'bower');
Yii::setAlias('@npm', $this->_vendorPath . DIRECTORY_SEPARATOR . 'npm');
/vendor/yiisoft/extensions.php配置的别名
Yii::setAlias('@webroot', dirname($request->getScriptFile()));
Yii::setAlias('@web', $request->getBaseUrl());
3.获取配置文件(配置项含义,见第4点)
4.实例化Application应用类
1)设置Yii::$app变量,$app就是Application的对象;
2)Yii::$app->loadedModules,设置当前类名到loadedModules;
3)设置当前状况$this->state
4)初始化配置:
第一步:检测是否配置了id,如果没有配置,则抛出异常;
第二步:设置basePath,basePath是别名@app的路径,即项目应用的路径;
第三步:设置vendorPath,当前步骤会设置@vendor、@bower、@npm,@vendor框架文件地址;
第四步:设置runtimePath,@runtime是运行时临时文件目录;
第五步:设置timeZone,timeZone是时区设置;
第六步:设置$config['components'],添加组件配置到components
'request' => ['class' => 'yii\web\Request'],
'response' => ['class' => 'yii\web\Response'],
'session' => ['class' => 'yii\web\Session'],
'user' => ['class' => 'yii\web\User'],
'errorHandler' => ['class' => 'yii\web\ErrorHandler'],
'log' => ['class' => 'yii\log\Dispatcher'],
'view' => ['class' => 'yii\web\View'],
'formatter' => ['class' => 'yii\i18n\Formatter'],
'i18n' => ['class' => 'yii\i18n\I18N'],
'mailer' => ['class' => 'yii\swiftmailer\Mailer'],
'urlManager' => ['class' => 'yii\web\UrlManager'],
'assetManager' => ['class' => 'yii\web\AssetManager'],
'security' => ['class' => 'yii\base\Security'],
$this->get('') 调用组件逻辑Yii::createObject($definition)
5)注册错误函数:$this->registerErrorHandler($config);
a)错误管理函数定义在$config['components']['errorHandler'],例如yii\web\ErrorAction;
b)register_shutdown_function注册一个 callback ,它会在脚本执行完成或者 exit() 后被调用;
6)Component组件初始化
第一步:设置Yii::configure($this, $config); 把config设置成当前对象属性;
第二步:$this->init(); 调用$this->bootstrap();
a)@vendor/yiisoft/extensions.php 设置别名,执行$extension['bootstrap']
b)config['bootstrap'] $this->_definitions包含配置的属性,通过Yii::createObject($definition);创建对象
c)yii\debug\Module和yii\gii\Module执行了引导程序$component->bootstrap($this);
d)yii\debug\Module添加了beforeRequest行为
5.执行$application->run();
1)执行beforeRequest行为:View的endBody行为添加$this->renderToolbar行为;
2)获取请求对象$this->getRequest(),coreComponents组件配置了'request' => ['class' => 'yii\web\Request'];
3)执行请求$this->handleRequest
第一步:获取$route, $params,yii\web\UrlManager->parseRequest()获取解析结果
$route = $request->getQueryParam($this->routeParam, ''); 直接获取GET里面的r参数的值
第二步:$this->runAction($route, $params);
第三步:runAction中实例控制器对象
a)controllerMap 控制器映射有对应配置,则直接创建控制器对象;
b)如果有$module,则$module->createController($route);
c)$this->createControllerByID($id . '/' . $route); 根据ID创建控制器对象
第四步:$controller->runAction($actionID, $params);
a)$this->createAction($id) 创建action
b)执行$module->beforeAction($action)
c)执行$this->beforeAction($action)
d)执行$action->runWithParams($params)
e)执行$this->afterAction($action, $result)
f)执行$module->afterAction($action, $result)
第五步:返回yii\web\Response的对象
6.调用$this->trigger(self::EVENT_AFTER_REQUEST);
7.返回$response->send();
原创粉丝点击