Yii核心组件AssetManager原理分析


Posted in PHP onDecember 02, 2014

本文我们通过yii自带的demo-blog程序来分析Yii核心组件AssetManager,他可以自动加载css和javascript,并且只需要一句代码即可。具体分析如下:

打开blog的首页,会看到如下的引入js的html代码:

<link rel="stylesheet" type="text/css" href="/yii/demos/blog/assets/d6bb6ebe/highlight.css" />

<link rel="stylesheet" type="text/css" href="/yii/demos/blog/assets/c2e28f0f/pager.css" />

<script type="text/javascript" src="/yii/demos/blog/assets/d6112c6a/jquery.min.js"></script>

<script type="text/javascript" src="/yii/demos/blog/assets/d6112c6a/jquery.ba-bbq.js"></script>

这些js文件的路径都在assets文件夹下,assets后面跟着一个显然经过hash的文件夹路径,同属于jq的js代码的路径相同,这段代码从何而来呢?

直接看view文件看不到任何引入js的代码,因此应该是使用widget引入的:

<?php

$this->widget('zii.widgets.CListView', array(

'dataProvider'=>$dataProvider,

'itemView'=>'_view',

'template'=>"{items}n{pager}",

));

?>

这个widget也是yii自带的zii扩展,于是乎我们可以找到zii的CListView代码,而CListView又是继承CBaseListView,因此先看CBaseListView的run方法:

public function run()

{

$this->registerClientScript();

echo CHtml::openTag($this->tagName,$this->htmlOptions)."n";

$this->renderKeys();

$this->renderContent();

echo CHtml::closeTag($this->tagName);

}

请注意第一个方法registerClientScript,这个方法是在CListView中实现的:

public function registerClientScript()

{

……

$cs=Yii::app()->getClientScript();

$cs->registerCoreScript('jquery');

$cs->registerCoreScript('bbq');

……

}

看到jquery和bbp似乎离真相近了些,接下来我们看CClientScript::registerCoreScript方法:

public function registerCoreScript($name)

{

$this->_hasScripts=true;

$this->_coreScripts[$name]=$name;

$params=func_get_args();

$this->recordCachingAction('clientScript','registerCoreScript',$params);

}

这里其实主要是记录了最终页面要render的js,而实际生成render的url是通过getCoreScriptUrl方法:

public function getCoreScriptUrl()

{

if($this->_baseUrl!==null)

return $this->_baseUrl;

else

return $this->_baseUrl=Yii::app()->getAssetManager()->publish(YII_PATH.'/web/js/source');

}

接下来我们看看publish的具体过程:

public function publish($path,$hashByName=false,$level=-1,$forceCopy=false)

{

if(is_file($src))

{

$dir=$this->hash($hashByName ? basename($src) : dirname($src));

$fileName=basename($src);

……

else if(is_dir($src))

{

$dir=$this->hash($hashByName ? basename($src) : $src);

$dstDir=$this->getBasePath().DIRECTORY_SEPARATOR.$dir;

……

}

这里通过对路径做了hash处理,因此我们看到的路径是不规则的,而由于jq系列的js代码均在同一路径下(都在framework/web/js/source下),所以hash值是相同的。

另外,除了如上所述,CAssetManager使得多个模块可以复用相同的代码制外,使用CAssetManager的另外一个好处是安全隔离,将真实的代码放在受保护的路径下,按需加载。

希望本文所述对大家基于yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php上传文件的增强函数
Jul 21 PHP
php设计模式 Template (模板模式)
Jun 26 PHP
解析使用ThinkPHP应该掌握的调试手段
Jun 20 PHP
php实现递归抓取网页类实例
Apr 03 PHP
PHP版本如何选择?应该使用哪个版本?
May 13 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
Jun 24 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
Dec 02 PHP
php简单实现单态设计模式的方法分析
Jul 28 PHP
Bootstrap+PHP实现多图上传功能实例详解
Apr 08 PHP
PHP面向对象程序设计之对象的遍历操作示例
Jun 12 PHP
PHP判断是否是json字符串
Apr 01 PHP
详解Laravel服务容器的优势
May 29 PHP
php实现微信公众平台账号自定义菜单类
Dec 02 #PHP
php获取CSS文件中图片地址并下载到本地的方法
Dec 02 #PHP
PHP间隔一段时间执行代码的方法
Dec 02 #PHP
ThinkPHP采用原生query实现关联查询left join实例
Dec 02 #PHP
php面象对象数据库操作类实例
Dec 02 #PHP
PHP实现的比较完善的购物车类
Dec 02 #PHP
Yii框架关联查询with用法分析
Dec 02 #PHP
You might like
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
php生成固定长度纯数字编码的方法
2015/07/09 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
VBScript版代码高亮
2006/06/26 Javascript
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
iScroll.js 使用方法参考
2016/05/16 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(1)
2017/02/20 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
electron实现qq快捷登录的方法示例
2018/10/22 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
浅谈Python peewee 使用经验
2017/10/20 Python
Python数据结构之顺序表的实现代码示例
2017/11/15 Python
python模块之paramiko实例代码
2018/01/31 Python
详解Python3中ceil()函数用法
2019/02/19 Python
python实现学员管理系统
2019/02/26 Python
CSS3弹性布局内容对齐(justify-content)属性使用详解
2017/07/31 HTML / CSS
CSS3 特效范例整理
2011/08/22 HTML / CSS
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
出纳的岗位职责
2013/11/09 职场文书
学校联谊活动方案
2014/02/15 职场文书
社区居务公开实施方案
2014/03/27 职场文书
个人自荐书怎么写
2015/03/26 职场文书
flex弹性布局详解
2022/03/20 HTML / CSS