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 30 PHP
php提示undefined index的几种解决方法
May 21 PHP
php设计模式之命令模式使用示例
Mar 02 PHP
php实现按照权重随机排序数据的方法
Jan 09 PHP
php给一组指定关键词添加span标签的方法
Mar 31 PHP
PHP查找与搜索数组元素方法总结
Jun 12 PHP
PHP中strpos、strstr和stripos、stristr函数分析
Jun 11 PHP
Docker 如何布置PHP开发环境
Jun 21 PHP
PHP读书笔记整理_结构语句详解
Jul 01 PHP
PHP如何实现订单的延时处理详解
Dec 30 PHP
php使用imagecopymerge()函数创建半透明水印
Jan 25 PHP
laravel中Redis队列监听中断的分析
Sep 14 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编程效率的53个要点(经验小结)
2010/09/04 PHP
php中unserialize返回false的解决方法
2014/09/22 PHP
PHP将字符分解为多个字符串的方法
2014/11/22 PHP
php解析url并得到url中的参数及获取url参数的四种方式
2015/10/26 PHP
ThinkPHP中类的构造函数_construct()与_initialize()的区别详解
2017/03/13 PHP
模仿jQuery each函数的链式调用
2009/07/22 Javascript
jQuery 表格插件整理
2010/04/27 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
jQuery无刷新分页完整实例代码
2015/10/27 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
Nodejs 发送Post请求功能(发短信验证码例子)
2017/02/09 NodeJs
jQuery控制元素隐藏和显示
2017/03/03 Javascript
认识less和webstrom的less配置方法
2017/08/02 Javascript
vue vant Area组件使用详解
2019/12/09 Javascript
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
[06:07]辉夜杯现场观众互动 “比谁远送显示器”
2015/12/26 DOTA
[05:49]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS 选手采访
2021/03/11 DOTA
python操作sqlite的CRUD实例分析
2015/05/08 Python
Django中针对基于类的视图添加csrf_exempt实例代码
2018/02/11 Python
python实现俄罗斯方块游戏
2020/03/25 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
python 扩展print打印文件路径和当前时间信息的实例代码
2019/10/11 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
css3旋转木马_动力节点Java学院整理
2017/07/12 HTML / CSS
纯HTML5+CSS3制作生日蛋糕(代码易懂)
2016/11/16 HTML / CSS
华为c/c++笔试题
2016/01/25 面试题
电信专业毕业生推荐信
2013/11/18 职场文书
优秀中学生事迹材料
2014/01/31 职场文书
感恩教育月活动总结
2014/07/07 职场文书
学习心理学的体会
2014/11/07 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
立秋之描写立秋的作文(五年级)
2019/08/08 职场文书
AngularJS实现多级下拉框
2022/03/25 Javascript
python实现简单的三子棋游戏
2022/04/28 Python