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 相关文章推荐
11个PHP 分页脚本推荐
Aug 15 PHP
用来解析.htgroup文件的PHP类
Sep 05 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
Jun 13 PHP
php常用数学函数汇总
Nov 21 PHP
php计算给定时间之前的函数用法实例
Apr 03 PHP
分享自定义的几个PHP功能函数
Apr 15 PHP
PHP获取当前相对于域名目录的方法
Jun 26 PHP
php PDO异常处理详解
Nov 20 PHP
php设计模式之装饰模式应用案例详解
Jun 17 PHP
Laravel 在views中加载公共页面的实现代码
Oct 22 PHP
PHP并发场景的三种解决方案代码实例
Feb 27 PHP
PHP7 list() 函数修改
Mar 09 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 静态变量的初始化
2009/11/15 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
JavaScript对象模型-执行模型
2008/04/28 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
javascript继承之为什么要继承
2012/11/10 Javascript
JavaScript 数组详解
2013/10/10 Javascript
JQuery 设置checkbox值二次无效的解决方法
2016/07/22 Javascript
jquery实现自定义图片裁剪功能【推荐】
2017/03/08 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
JS 实现微信扫一扫功能
2018/09/14 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
Python向日志输出中添加上下文信息
2017/05/24 Python
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
对Python中range()函数和list的比较
2018/04/19 Python
基于python绘制科赫雪花
2018/06/22 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
社区中秋节活动方案
2014/01/29 职场文书
客户接待方案
2014/02/26 职场文书
环境日宣传活动总结
2014/07/09 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
领导班子作风建设剖析材料
2014/10/11 职场文书
单位租房协议书样本
2014/10/30 职场文书
工程合作意向书范本
2015/05/09 职场文书
大学升旗仪式主持词
2015/07/04 职场文书
妇产科护理心得体会
2016/01/22 职场文书
利用Redis实现点赞功能的示例代码
2022/06/28 Redis