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程序员面试 切忌急功近利(更需要注重以后的发展)
Sep 01 PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 PHP
如何取得中文字符串中出现次数最多的子串
Aug 08 PHP
php递归使用示例(php递归函数)
Feb 14 PHP
PHP也能干大事 随机函数
Apr 14 PHP
thinkPHP导出csv文件及用表格输出excel的方法
Dec 30 PHP
教你php如何实现验证码
Jan 20 PHP
浅谈PHP中如何实现Hook机制
Nov 14 PHP
PHP简单实现防止SQL注入的方法
Mar 13 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
Oct 30 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 PHP
PHP 实现 WebSocket 协议原理与应用详解
Apr 22 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中常用字符串处理代码片段整理
2011/11/07 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
PDO::inTransaction讲解
2019/01/28 PHP
jquery animate实现鼠标放上去显示离开隐藏效果
2013/07/21 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
详解JavaScript函数
2015/12/01 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
微信小程序如何修改本地缓存key中单个数据的详解
2019/04/26 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
2020/08/04 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
[07:25]DOTA2-DPC中国联赛2月5日Recap集锦
2021/03/11 DOTA
教你用Python脚本快速为iOS10生成图标和截屏
2016/09/22 Python
python实现机器学习之多元线性回归
2018/09/06 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
python脚本执行CMD命令并返回结果的例子
2019/08/14 Python
python常用排序算法的实现代码
2019/11/08 Python
Django 博客实现简单的全文搜索的示例代码
2020/02/17 Python
python 制作本地应用搜索工具
2021/02/27 Python
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
Java中实现多态的机制是什么?
2014/12/07 面试题
恶搞卫生巾广告词
2014/03/18 职场文书
市场推广策划方案
2014/06/02 职场文书
优秀毕业生求职信
2014/06/05 职场文书
辣妈辣妹观后感
2015/06/10 职场文书
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫
剧场版《转生恶役只好拔除破灭旗标》公开最新视觉图 2023年上映
2022/04/02 日漫