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函数
Oct 09 PHP
PHP与SQL注入攻击[三]
Apr 17 PHP
php面向对象全攻略 (三)特殊的引用“$this”的使用
Sep 30 PHP
zen cart新进商品的随机排序修改方法
Sep 10 PHP
php中用foreach来操作数组的代码
Jul 17 PHP
探讨PHP使用eAccelerator的API开发详解
Jun 09 PHP
PHP根据两点间的经纬度计算距离
Oct 31 PHP
PHP Opcache安装和配置方法介绍
May 28 PHP
PHP 读取文本文件内容并分页显示
Jan 02 PHP
PHP之十六个魔术方法详细介绍
Nov 01 PHP
magento后台无法登录解决办法的两种方法
Dec 09 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
php导入导出excel实例
2013/10/25 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
PHP的几个常用加密函数
2016/02/03 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
2012/08/01 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
javascript数组输出的两种方式
2015/01/13 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
ES6新特性八:async函数用法实例详解
2017/04/21 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
vue cli使用融云实现聊天功能的实例代码
2019/04/19 Javascript
jQuery实现高级检索功能
2019/05/28 jQuery
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
简单使用webpack打包文件的实现
2019/10/29 Javascript
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
JS实现手风琴特效
2020/11/08 Javascript
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
Python学习笔记之解析json的方法分析
2017/04/21 Python
Python中py文件引用另一个py文件变量的方法
2018/04/29 Python
使用Pandas对数据进行筛选和排序的实现
2019/07/29 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
html5使用canvas画一条线
2014/12/15 HTML / CSS
菲律宾旅游网站:Expedia菲律宾
2017/10/11 全球购物
计算机系统管理员求职信
2014/06/20 职场文书
党员个人对照检查材料
2014/10/01 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
承兑汇票转让证明怎么写?
2014/11/30 职场文书