`

Yii分析13:Yii核心组件之AssetManager

阅读更多

    我们通过使用来讲解CAssetManager的使用和工作机制,可以直接看yii自带的demo-blog,打开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的另外一个好处是安全隔离,将真实的代码放在受保护的路径下,按需加载。

0
1
分享到:
评论

相关推荐

    Yii核心组件AssetManager原理分析

    Yii框架的AssetManager是其核心组件之一,负责管理和发布应用中的静态资源,如CSS样式表、JavaScript文件等。AssetManager的主要任务是将这些资源从源目录复制到一个可公开访问的Web目录,以便在浏览器中正确加载。...

    yii框架教程

    Yii 提供了一系列预定义的核心组件来支持 Web 应用程序的通用功能,例如: - **assetManager**: `CAssetManager` — 管理私有资源文件的发布。 - **authManager**: `CAuthManager` — 管理基于角色的访问控制 (RBAC...

    Yii2 assets清除缓存的方法

    在介绍 Yii2 清除 assets 缓存方法之前,我们需要先了解 Yii2 的 AssetManager 组件。AssetManager 是 Yii2 用于管理资源文件(如 JavaScript、CSS 文件等)的组件。它负责将资源文件复制到 web 可访问目录(通常是 ...

    Yii_Cookbook

    - **实现方式**:介绍使用`Yii::app()-&gt;assetManager`管理静态资源的方法。 ##### 9. Eclipse PDT代码提示、引用和其他好用功能 - **知识点**:提高使用Eclipse PDT进行Yii开发的效率。 - **实现方式**:配置...

    yii2.0-Ueditor百度编辑器

    Yii2.0是一款基于组件的高性能PHP框架,用于开发Web应用程序。它采用了MVC(Model-View-Controller)设计模式,提供了丰富的特性,包括 ActiveRecord、I18N 和 L10N 支持、缓存策略、身份验证及权限控制等。在Yii2.0...

    YII中assets的使用示例

    一、YII assets的作用: 1.yii中assets的作用是方便模块化,插件化的,一般来说出于安全原因不允许通过url访问protected下面的文件 ,但是我们又希望将module...$baseUrl = Yii::app()-&gt;assetManager-&gt;publish($asset

    yii1的百度编辑器

    这可以通过在视图文件中使用`Yii::app()-&gt;assetManager-&gt;publish()`函数来完成。 3. **创建表单**:在需要使用UEditor的表单中,用JavaScript代码替换传统的textarea元素。例如: ```html ...

    yii2-pages-asset:Revox.Io页面的Yii2资产捆绑

    Asset Bundle是Yii2中的一个核心组件,它允许开发者组织和优化Web应用的静态资源。Asset Bundle可以看作是一组相关的文件集合,包括JavaScript、CSS、图片等,它们被一起打包并部署到服务器上,以便在网页中使用。...

    Yii2中使用asset压缩js,css文件的方法

    Asset Manager是Yii2中管理资产文件的组件,负责加载和发布资源文件。 完成配置文件编辑后,接下来的操作是将压缩后的资产包文件放置在指定目录。需要在`web/assets`下创建`js`和`css`文件夹,并设置适当的权限,...

    yii2简单使用less代替css示例

    首先,要在Yii2项目中使用Less,需要在composer.json文件中添加相应的组件。通过执行命令: ``` php composer.phar require --prefer-dist singrana/yii2-less "*" ``` 上述命令将会把singrana/yii2-less包添加到...

    assetparser:Yii2的资产解析器(AssertConverter)

    仅适用于带有新资产管理器的 YII2,无需外部工具和可执行文件即可将 Less 和 Sass 文件转换为 CSS。...在您的 YII 配置文件 {app}/config/web.php 中修改 assetManager 组件定义 [php] 'assetManager' =&gt; arra

    yii2-adminlte-widgets

    AdminLte主题小部件 将3.x标签用于yii&gt; = 2.0.13 将2.x标签用于yii [ //-------- 'assetManager' =&gt;[ 'class' =&gt; 'yii\web\AssetManager' ,

    yii2-widget-摩纳哥

    在Yii2框架中,Widget是将UI组件封装为独立的可重用对象,这使得开发者可以轻松地在不同地方使用相同的UI元素。"yii2-widget-monaco"就是这样的一个Widget,它将Monaco编辑器集成到Yii2应用中,允许开发者快速创建...

Global site tag (gtag.js) - Google Analytics