java assetmanager_Yii核心组件AssetManager原理分析
本文我们通过yii自带的demo-blog程序来分析Yii核心组件AssetManager,他可以自动加载css和javascript,并且只需要一句代码即可。具体分析如下:
打开blog的首页,会看到如下的引入js的html代码:
这些js文件的路径都在assets文件夹下,assets后面跟着一个显然经过hash的文件夹路径,同属于jq的js代码的路径相同,这段代码从何而来呢?
直接看view文件看不到任何引入js的代码,因此应该是使用widget引入的:
$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程序设计有所帮助。
java assetmanager_Yii核心组件AssetManager原理分析相关推荐
- 深入掌握Java技术 EJB调用原理分析
深入掌握Java技术 EJB调用原理分析 一个远程对象至少要包括4个class文件:远程对象:远程对象的接口:实现远程接口的对象的stub:对象的skeleton这4个class文件. 在 ...
- Java NIO使用及原理分析
http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一些Java方面的开发,其中最重要的一块 ...
- 【转载保存】Java 8 Lambda实现原理分析
怒学Java8系列一:Lambda表达式介绍 Java 8 Lambda实现原理分析
- Java 线程池(ThreadPoolExecutor)原理分析与使用 – 码农网
线程池的详解 Java 线程池(ThreadPoolExecutor)原理分析与使用 – 码农网 http://www.codeceo.com/article/java-threadpool-exec ...
- Java NIO使用及原理分析(二)
2019独角兽企业重金招聘Python工程师标准>>> 转载自:李会军•宁静致远 在第一篇中,我们介绍了NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是 ...
- Java并发编程—AQS原理分析
目录 一.AQS原理简述 二.自定义独占锁及共享锁 三.锁的可重入性 四.锁的公平性 五.惊群效应 AQS全称AbstractQueuedSynchronizer,它是实现 JCU包中几乎所有的锁.多 ...
- 支付宝app支付java后台流程、原理分析(含nei wang chuan tou)
java版支付宝app支付流程及原理分析 本实例是基于springmvc框架编写 一.流程步骤 1.执行流程 当手机端app(就是你公司开发的app) ...
- Java并发编程—ScheduledThreadPoolExecutor原理分析
原文作者:小付 原文地址:ScheduledThreadPoolExecutor原理分析 目录 一.简单使用 二.类UML图 三.处理流程 四.任务提交方式 五.SchduledFutureTask之 ...
- Java 线程池(ThreadPoolExecutor)原理分析与使用
ThreadPoolExecutor原理概述 在我们的开发中"池"的概念并不罕见,有数据库连接池.线程池.对象池.常量池等等.下面我们主要针对线程池来一步一步揭开线程池的面纱. 使 ...
最新文章
- 手把手入门神经网络系列(2)_74行代码实现手写数字识别
- C语言extern关键字(去使用外部全局变量、函数)
- springboot开始
- 使用FSO修改文件夹的名称
- 利用VmWare_在本地内网IP地址段_搭建Centos7测试MyCat集群_亲测---Linux工作笔记044
- 向上取整和向下取整(ceil、round)
- php怎样注释代码块,vscode怎样注释方法代码块
- LIS最长上升子序列详解+模板(dp和二分做法)
- 怎么下载计算机考试准考证
- 环保数采仪 环保行业的绿色卫士
- 好的软件测试的简历是什么样的?
- 基于 HTML5 WebGL 的 3D 网络拓扑图
- Android Parcel对象详解
- kafka reassign 限速_高速限速有了新规矩!公路限速标志设计规范即将施行
- Coding Interview University学习
- ideaVim 使用总结
- 中国医学计算机成级别像杂志,中国医学计算机成像杂志怎么样,审稿时间
- 新概念1 课文和单词(2022/12/21)
- 背景建模(一) Evaluation of Background Subtraction Techniques
- flex builder 4
热门文章
- 外汇跟单系统如何绑定云服务器,在交易家外汇喊单平台上进行跟单,怎么绑定MT4...
- C语言-格式输入与输出
- 矩阵分析学习笔记(五):数域上矩阵的特征矩阵
- 全球及中国办公家具行业品牌竞争分析与销售前景研究报告2022版
- QEMU + KVM环境搭建
- 大数据分布式存储方案的两种部署模式-分离式和超融合
- three.js 精灵模型-树林效果
- 如何利用今日头条盈利?
- 奔向财富自由之路的10条建议
- 虚拟内存越大越好吗_手机如何选择屏幕分辩率?720p、1080P,数值越大越好吗?...