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中使用与Perl兼容的正则表达式
Nov 26 PHP
剖析 PHP 中的输出缓冲
Dec 21 PHP
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
Jan 06 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
Jan 27 PHP
php实现监听事件
Nov 06 PHP
destoon调用自定义模板及样式的公告栏
Jun 21 PHP
PHP反向代理类代码
Aug 15 PHP
php生成动态验证码gif图片
Oct 19 PHP
jquery+thinkphp实现跨域抓取数据的方法
Oct 15 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 PHP
PHP面向对象类型约束用法分析
Jun 12 PHP
php的命名空间与自动加载实现方法
Aug 25 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
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
php Memcache 中实现消息队列
2009/11/24 PHP
通过JavaScript或PHP检测Android设备的代码
2011/03/09 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
Move.js入门
2017/02/08 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
2020/03/10 Javascript
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
[49:08]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.27
2020/12/01 DOTA
Python使用openpyxl读写excel文件的方法
2017/06/30 Python
Python双向循环链表实现方法分析
2018/07/30 Python
Anaconda2 5.2.0安装使用图文教程
2018/09/19 Python
解决python文件双击运行秒退的问题
2019/06/24 Python
django 使用全局搜索功能的实例详解
2019/07/18 Python
python多进程间通信代码实例
2019/09/30 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
打造高效课堂实施方案
2014/03/22 职场文书
高中生家长寄语大全
2014/04/03 职场文书
文案策划岗位职责
2015/02/11 职场文书
项目验收申请报告
2015/05/15 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
使用Redis实现秒杀功能的简单方法
2021/05/08 Redis
react中的DOM操作实现
2021/06/30 Javascript