本文我们通过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原理分析相关推荐

  1. 深入掌握Java技术 EJB调用原理分析

      深入掌握Java技术 EJB调用原理分析     一个远程对象至少要包括4个class文件:远程对象:远程对象的接口:实现远程接口的对象的stub:对象的skeleton这4个class文件. 在 ...

  2. Java NIO使用及原理分析

    http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一些Java方面的开发,其中最重要的一块 ...

  3. 【转载保存】Java 8 Lambda实现原理分析

    怒学Java8系列一:Lambda表达式介绍 Java 8 Lambda实现原理分析

  4. Java 线程池(ThreadPoolExecutor)原理分析与使用 – 码农网

    线程池的详解 Java 线程池(ThreadPoolExecutor)原理分析与使用 – 码农网 http://www.codeceo.com/article/java-threadpool-exec ...

  5. Java NIO使用及原理分析(二)

    2019独角兽企业重金招聘Python工程师标准>>> 转载自:李会军•宁静致远 在第一篇中,我们介绍了NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是 ...

  6. Java并发编程—AQS原理分析

    目录 一.AQS原理简述 二.自定义独占锁及共享锁 三.锁的可重入性 四.锁的公平性 五.惊群效应 AQS全称AbstractQueuedSynchronizer,它是实现 JCU包中几乎所有的锁.多 ...

  7. 支付宝app支付java后台流程、原理分析(含nei wang chuan tou)

    java版支付宝app支付流程及原理分析 本实例是基于springmvc框架编写      一.流程步骤          1.执行流程            当手机端app(就是你公司开发的app) ...

  8. Java并发编程—ScheduledThreadPoolExecutor原理分析

    原文作者:小付 原文地址:ScheduledThreadPoolExecutor原理分析 目录 一.简单使用 二.类UML图 三.处理流程 四.任务提交方式 五.SchduledFutureTask之 ...

  9. Java 线程池(ThreadPoolExecutor)原理分析与使用

    ThreadPoolExecutor原理概述 在我们的开发中"池"的概念并不罕见,有数据库连接池.线程池.对象池.常量池等等.下面我们主要针对线程池来一步一步揭开线程池的面纱. 使 ...

最新文章

  1. 手把手入门神经网络系列(2)_74行代码实现手写数字识别
  2. C语言extern关键字(去使用外部全局变量、函数)
  3. springboot开始
  4. 使用FSO修改文件夹的名称
  5. 利用VmWare_在本地内网IP地址段_搭建Centos7测试MyCat集群_亲测---Linux工作笔记044
  6. 向上取整和向下取整(ceil、round)
  7. php怎样注释代码块,vscode怎样注释方法代码块
  8. LIS最长上升子序列详解+模板(dp和二分做法)
  9. 怎么下载计算机考试准考证
  10. 环保数采仪 环保行业的绿色卫士
  11. 好的软件测试的简历是什么样的?
  12. 基于 HTML5 WebGL 的 3D 网络拓扑图
  13. Android Parcel对象详解
  14. kafka reassign 限速_高速限速有了新规矩!公路限速标志设计规范即将施行
  15. Coding Interview University学习
  16. ideaVim 使用总结
  17. 中国医学计算机成级别像杂志,中国医学计算机成像杂志怎么样,审稿时间
  18. 新概念1 课文和单词(2022/12/21)
  19. 背景建模(一) Evaluation of Background Subtraction Techniques
  20. flex builder 4

热门文章

  1. 外汇跟单系统如何绑定云服务器,在交易家外汇喊单平台上进行跟单,怎么绑定MT4...
  2. C语言-格式输入与输出
  3. 矩阵分析学习笔记(五):数域上矩阵的特征矩阵
  4. 全球及中国办公家具行业品牌竞争分析与销售前景研究报告2022版
  5. QEMU + KVM环境搭建
  6. 大数据分布式存储方案的两种部署模式-分离式和超融合
  7. three.js 精灵模型-树林效果
  8. 如何利用今日头条盈利?
  9. 奔向财富自由之路的10条建议
  10. 虚拟内存越大越好吗_手机如何选择屏幕分辩率?720p、1080P,数值越大越好吗?...