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 相关文章推荐
一个很方便的 XML 类!!原创的噢
Oct 09 PHP
php中截取字符串支持utf-8
Jan 18 PHP
常用的php ADODB使用方法集锦
Mar 25 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
Apr 18 PHP
php设计模式 Adapter(适配器模式)
Jun 26 PHP
php下载文件的代码示例
Jun 29 PHP
php中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
php中把美国时间转为北京时间的自定义函数分享
Jul 28 PHP
php实现图片局部打马赛克的方法
Feb 11 PHP
详解php中反射的应用
Mar 15 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
Aug 19 PHP
PHP 二维array转换json的实例讲解
Aug 21 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可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
php 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
PHP技术开发技巧分享
2010/03/23 PHP
PHP中防止SQL注入实现代码
2011/02/19 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
PHP 8新特性简介
2020/08/18 PHP
JavaScript延迟加载
2021/03/09 Javascript
js 提交和设置表单的值
2008/12/19 Javascript
js charAt的使用示例
2014/02/18 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
Angularjs中UI Router的使用方法
2016/05/14 Javascript
js前端面试题及答案整理(一)
2016/08/26 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
[03:12]2016完美“圣”典风云人物:单车专访
2016/12/02 DOTA
python网络编程学习笔记(六):Web客户端访问
2014/06/09 Python
详解在Python程序中自定义异常的方法
2015/10/16 Python
python中将字典形式的数据循环插入Excel
2018/01/16 Python
python 获取图片分辨率的方法
2019/01/08 Python
对Python3 序列解包详解
2019/02/16 Python
wxPython实现绘图小例子
2019/11/19 Python
python实现在一个画布上画多个子图
2020/01/19 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
python 实现控制鼠标键盘
2020/11/27 Python
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
秸秆管理实施方案
2014/03/15 职场文书
职务聘任书范文
2014/03/29 职场文书
工作推荐信范文
2014/05/10 职场文书
计划生育宣传标语
2014/06/21 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
2015大学自主招生自荐信范文
2015/03/04 职场文书
MySQL 重写查询语句的三种策略
2021/05/10 MySQL