国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

Yii核心組件AssetManager原理分析

2024-05-04 23:28:27
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Yii核心組件AssetManager原理分析,較為詳細的分析了AssetManager組件的原理與實現過程,有助于深入了解yii框架的特性,需要的朋友可以參考下
 
 

本文我們通過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程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沐川县| 乌拉特中旗| 浠水县| 关岭| 车险| 饶河县| 资阳市| 陵水| 永城市| 石狮市| 沁水县| 沂南县| 礼泉县| 安化县| 平利县| 平舆县| 尉氏县| 麻江县| 电白县| 靖远县| 格尔木市| 民县| 伊金霍洛旗| 白朗县| 乌审旗| 中牟县| 柘城县| 岫岩| 五指山市| 嘉义市| 岫岩| 杭锦旗| 乌兰浩特市| 桂阳县| 丰镇市| 昔阳县| 定州市| 巴彦淖尔市| 禄丰县| 阿拉尔市| 商南县|