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,不用COM,生成excel文件
Oct 09 PHP
PHP的FTP学习(四)
Oct 09 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
php读取本地文件常用函数(fopen与file_get_contents)
Sep 09 PHP
PHP 如何获取二维数组中某个key的集合
Jun 03 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
Jul 29 PHP
使用PHPMailer发送邮件实例
Feb 15 PHP
Laravel下生成验证码的类
Nov 15 PHP
PHP压缩图片功能的介绍
Mar 21 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
Apr 04 PHP
PHP 超级全局变量相关总结
Jun 30 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
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
索尼ICF-SW100收音机评测
2021/03/02 无线电
php一行代码获取文件后缀名实例分析
2014/11/12 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
php实现的简单检验登陆类
2015/06/18 PHP
判断脚本加载是否完成的方法
2009/05/26 Javascript
jQuery 使用手册(七)
2009/09/23 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
JS图片压缩(pc端和移动端都适用)
2017/01/12 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
JS中的变量作用域(console版)
2020/07/18 Javascript
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
python打包压缩、读取指定目录下的指定类型文件
2018/04/12 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
详解django实现自定义manage命令的扩展
2019/08/13 Python
python全局变量引用与修改过程解析
2020/01/07 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
行政人事经理职位说明书
2014/03/05 职场文书
初一学生期末评语
2014/04/24 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
副乡长民主生活会个人对照检查材料思想汇报
2014/10/01 职场文书
财务会计实训报告
2014/11/05 职场文书
2014年客服工作总结与计划
2014/12/09 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
《祁黄羊》教学反思
2016/02/20 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android
Oracle 临时表空间SQL语句的实现
2021/09/25 Oracle
Python 数据结构之十大经典排序算法一文通关
2021/10/16 Python