我们通过使用来讲解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的另外一个好处是安全隔离,将真实的代码放在受保护的路径下,按需加载。
分享到:
相关推荐
Yii框架的AssetManager是其核心组件之一,负责管理和发布应用中的静态资源,如CSS样式表、JavaScript文件等。AssetManager的主要任务是将这些资源从源目录复制到一个可公开访问的Web目录,以便在浏览器中正确加载。...
Yii 提供了一系列预定义的核心组件来支持 Web 应用程序的通用功能,例如: - **assetManager**: `CAssetManager` — 管理私有资源文件的发布。 - **authManager**: `CAuthManager` — 管理基于角色的访问控制 (RBAC...
在介绍 Yii2 清除 assets 缓存方法之前,我们需要先了解 Yii2 的 AssetManager 组件。AssetManager 是 Yii2 用于管理资源文件(如 JavaScript、CSS 文件等)的组件。它负责将资源文件复制到 web 可访问目录(通常是 ...
- **实现方式**:介绍使用`Yii::app()->assetManager`管理静态资源的方法。 ##### 9. Eclipse PDT代码提示、引用和其他好用功能 - **知识点**:提高使用Eclipse PDT进行Yii开发的效率。 - **实现方式**:配置...
Yii2.0是一款基于组件的高性能PHP框架,用于开发Web应用程序。它采用了MVC(Model-View-Controller)设计模式,提供了丰富的特性,包括 ActiveRecord、I18N 和 L10N 支持、缓存策略、身份验证及权限控制等。在Yii2.0...
一、YII assets的作用: 1.yii中assets的作用是方便模块化,插件化的,一般来说出于安全原因不允许通过url访问protected下面的文件 ,但是我们又希望将module...$baseUrl = Yii::app()->assetManager->publish($asset
这可以通过在视图文件中使用`Yii::app()->assetManager->publish()`函数来完成。 3. **创建表单**:在需要使用UEditor的表单中,用JavaScript代码替换传统的textarea元素。例如: ```html ...
Asset Bundle是Yii2中的一个核心组件,它允许开发者组织和优化Web应用的静态资源。Asset Bundle可以看作是一组相关的文件集合,包括JavaScript、CSS、图片等,它们被一起打包并部署到服务器上,以便在网页中使用。...
Asset Manager是Yii2中管理资产文件的组件,负责加载和发布资源文件。 完成配置文件编辑后,接下来的操作是将压缩后的资产包文件放置在指定目录。需要在`web/assets`下创建`js`和`css`文件夹,并设置适当的权限,...
首先,要在Yii2项目中使用Less,需要在composer.json文件中添加相应的组件。通过执行命令: ``` php composer.phar require --prefer-dist singrana/yii2-less "*" ``` 上述命令将会把singrana/yii2-less包添加到...
仅适用于带有新资产管理器的 YII2,无需外部工具和可执行文件即可将 Less 和 Sass 文件转换为 CSS。...在您的 YII 配置文件 {app}/config/web.php 中修改 assetManager 组件定义 [php] 'assetManager' => arra
AdminLte主题小部件 将3.x标签用于yii> = 2.0.13 将2.x标签用于yii [ //-------- 'assetManager' =>[ 'class' => 'yii\web\AssetManager' ,
在Yii2框架中,Widget是将UI组件封装为独立的可重用对象,这使得开发者可以轻松地在不同地方使用相同的UI元素。"yii2-widget-monaco"就是这样的一个Widget,它将Monaco编辑器集成到Yii2应用中,允许开发者快速创建...