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 相关文章推荐
mayfish 数据入库验证代码
Apr 30 PHP
php笔记之:AOP的应用
Apr 24 PHP
用php简单实现加减乘除计算器
Jan 06 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
Nov 18 PHP
php用ini_get获取php.ini里变量值的方法
Mar 04 PHP
php判断输入是否是纯数字,英文,汉字的方法
Mar 05 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
Dec 19 PHP
php用正则判断是否为数字的方法
Mar 25 PHP
thinkphp配置文件路径的实现方法
Aug 30 PHP
PHP内置函数生成随机数实例
Jan 18 PHP
PHP实现百度人脸识别
May 06 PHP
基于php+MySql实现学生信息管理系统实例
Aug 04 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
5.PHP的其他功能
2006/10/09 PHP
解析PHP中一些可能会被忽略的问题
2013/06/21 PHP
php生成二维码时出现中文乱码的解决方法
2014/12/18 PHP
php调用KyotoTycoon简单实例
2015/04/02 PHP
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
jsTree使用记录实例
2016/12/01 Javascript
JS+HTML5 FileReader对象用法示例
2017/04/07 Javascript
js装饰设计模式学习心得
2018/02/17 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
node.js Promise对象的使用方法实例分析
2019/12/26 Javascript
jquery更改元素属性attr()方法操作示例
2020/05/22 jQuery
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
Vue+axios封装请求实现前后端分离
2020/10/23 Javascript
Python生成验证码实例
2014/08/21 Python
Python使用logging结合decorator模式实现优化日志输出的方法
2016/04/16 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
2017/08/30 Python
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
python爬取指定微信公众号文章
2018/12/20 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
2019/01/08 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
Python拼接字符串的7种方式详解
2020/03/19 Python
django实现HttpResponse返回json数据为中文
2020/03/27 Python
python与idea的集成的实现
2020/11/20 Python
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
PurCotton全棉时代官网:100%天然棉花生产的生活护理用品
2016/11/18 全球购物
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
init进程的作用
2012/04/12 面试题
英语专业毕业个人求职自荐信
2013/09/21 职场文书
长城导游词300字
2015/01/30 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS
Python 装饰器(decorator)常用的创建方式及解析
2022/04/24 Python