Yii核心组件AssetManager分析教程

打开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的另外一个好处是安全隔离,将真实的代码放在受保护的路径下,按需加载。

时间: 2024-09-05 11:42:03

Yii核心组件AssetManager分析教程的相关文章

Yii核心组件AssetManager原理分析_php实例

本文我们通过yii自带的demo-blog程序来分析Yii核心组件AssetManager,他可以自动加载css和javascript,并且只需要一句代码即可.具体分析如下: 打开blog的首页,会看到如下的引入js的html代码: 复制代码 代码如下: <link rel="stylesheet" type="text/css" href="/yii/demos/blog/assets/d6bb6ebe/highlight.css" /&

YII AssetManager分析 最小化脚本文件

为什么用YII assets 1.assets的作用是方便模块化,插件化的,一般来说出于安全原因不允许通过url访问protected下面的文件 ,但是我们又希望将module单独出来,所以需要使用发布,即将一个目录下的文件复制一份到assets下面方便通过url访问 Java代码   $assets = Yii::getPathOfAlias('ext').'/css';   //$baseUrl = Yii::app()->getAssetManager()->publish($asset

Yii快速入门经典教程_php实例

本文讲述了Yii快速入门教程.分享给大家供大家参考,具体如下: Ⅰ.基本概念 一.入口文件 入口文件内容:一般格式如下: <?php $yii=dirname(__FILE__).'/../../framework/yii.php';//Yii框架位置 $config=dirname(__FILE__).'/protected/config/main.php';//当前应用程序的主配置文件位置 // 部署正式环境时,去掉下面这行 // defined('YII_DEBUG') or define

PHP的Yii框架入门使用教程_php实例

安装 Yii 的安装由如下两步组成: 从 yiiframework.com 下载 Yii 框架. 将 Yii 压缩包解压至一个 Web 可访问的目录. Tip|提示: 安装在 Web 目录不是必须的,每个 Yii 应用都有一个入口脚本,只有它才必须暴露给 Web 用户.其它 PHP 脚本(包括 Yii)应该保护起来不被 Web 访问,因为它们可能会被黑客利用.需求 安装完 Yii 以后你也许想验证一下你的服务器是否满足使用 Yii 的要求,只需浏览器中输入如下网址来访问需求检测脚本: http:

情感分析教程+心法!如何用 Apache MXNet 看懂电影影评

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud 情感分析已经在数据科学界占有一席之地.企业可以在社交媒体上对其产品的评价,并主动出击,解决满意度问题.不过,人类的情感和语言非常复杂,机器学习的各种技术中,就数深度学习最有能力处理这些复杂的输入数据. 这份教程中,我们将使用 Apache MXNet 打造神经网络,目的是创造一个电影影评的分类器,能够根据一段简评判断作者对电影的评价是好是坏.之所以选择 Apache MXNet 而不是 TensorFlow等

vps的iis日志查看及分析教程

vps是现在很多站长习惯使用的主机之一,它的功能基本上和服务器类似,但是价格要便宜很多,和虚拟主机相比就有更多优势了.网站日志分析是站长每天的必备工作之一,特别是分析网站是否被降权.哪些页面被收录等等,下面笔者就结合实际情况分析一下vps的iis是怎样查看的: 第一步,怎样在vps里面找到iis文件 进入vps的管理之后,打开"Internet 信息服务(IIS)管理器" 进入管理以后打开vps(本地计算机) 双击vps(本地计算机),在网站栏目那里右键单击选择属性. 在弹出的窗口里面

蓝屏dump分析教程 使用WinDbg分析工具

  一.WinDbg是什么?它能做什么? WinDbg是在windows平台下,强大的用户态和内核态调试工具.它能够通过dmp文件轻松的定位到问题根源,可用于分析蓝屏.程序崩溃(IE崩溃)原因,是我们日常工作中必不可少的一个有力工具,学会使用它,将有效提升我们的问题解决效率和准确率. 三.设置符号表: 符号表是WinDbg关键的"数据库",如果没有它,WinDbg基本上就是个废物,无法分析出更多问题原因.所以使用WinDbg设置符号表,是必须要走的一步. 1.运行WinDbg软件,然后

GoogleAnalytics谷歌分析教程:功能简介

一.Google Analytics(分析)简介 (一)简介Google Analytics(是一款免费的 Web 分析产品,根据它提供的丰富详尽的图表式报告,网站管理员与营销人员可以更好地了解并影响访问者的行为,从而提高营销活动的投资回报率.向您显示人们如何找到和浏览您的网站以及您能如何改善访问者的体验.提高贵网站的投资回报率.访问转换率和网站经济效益. (二)哪些用户应使用 Google Analytics(分析) 管理人员: ?  哪些营销活动最有效? ?  我网站上的流量模式/趋势是怎样

Java的LinkedHashSet源码分析教程

1.简介 我们知道Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.根据源码实现中的注释我们可以知道LinkedHashSet是具有可预知迭代顺序的Set接口的哈希表和链接列表实现.此实现与HashSet的不同之处在于,后者维护着一个运行于所有条目的双重链接列表.此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序.使用示例如下:  代码如下 复制代码 package com.test.collections;   import java.ut