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 相关文章推荐
解决控件遮挡问题:关于有窗口元素和无窗口元素
Jan 28 PHP
php+xml实现在线英文词典之添加词条的方法
Jan 23 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
如何在旧的PHP系统中使用PHP 5.3之后的库
Dec 02 PHP
深入解析WordPress中加载模板的get_template_part函数
Jan 11 PHP
分享一个漂亮的php验证码类
Sep 29 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
Aug 01 PHP
PHP递归的三种常用方式
Feb 28 PHP
PHP实现获取url地址中顶级域名的方法示例
Jun 05 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
Aug 05 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 PHP
php实现统计IP数及在线人数的示例代码
Jul 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用正则判断是否为数字的方法
2016/03/25 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
PHP创建XML接口示例
2019/07/04 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
Javascript表格翻页效果的具体实现
2013/10/05 Javascript
Node.js插件的正确编写方式
2014/08/03 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解
2015/03/05 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
不能不知道的10个angularjs英文学习网站
2016/03/23 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
js控制台输出的方法(详解)
2016/11/26 Javascript
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
详解NodeJs开发微信公众号
2018/05/25 NodeJs
vue 动态表单开发方法案例详解
2019/12/02 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
应届毕业生个人自我评价
2013/09/20 职场文书
数控技术与应用毕业生自荐信
2013/09/24 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
青春无悔演讲稿
2014/05/08 职场文书
办公室主任岗位承诺书
2014/05/29 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL