资源版本管理的优化 - 资源包支持别名 ¶
本文导航
作者:KK
发表日期:2016.11.06
问题 ¶
AssetsBundle
默认并不支持别名输出资源,比如这样定义Assets是不行的:
<?php
namespace app\assets;
class CommonAsset extends \yii\web\AssetBundle{
public $css = [
'@a.css',
];
public $js = [
'@b.js',
];
}
这样输出到模板里的资源地址直接就是@a.css
这样的资源别名,而不是别名的值,所以需要重写一些AssetsBundle的处理,实现别名输出的支持
让AssetsBundle支持别名 ¶
namespace app\lib;
/**
* 基础资源包,支持别包解析CSS和JS路径
*/
class AssetBundle extends \yii\web\AssetBundle{
/**
* @inheritdoc
*/
public function init(){
parent::init();
//解析JS别名
foreach($this->js as &$js){
$js = $this->parseResourceAlias($js);
}
//解析CSS别名
foreach($this->css as &$css){
$css = $this->parseResourceAlias($css);
}
}
/**
* 解析资源别名
* @param string $resourceAlias 别名
* @return string 解析后的资源地址
*/
public function parseResourceAlias($resourceAlias){
try{
$publishUrl = \Yii::getAlias($resourceAlias);
if($publishUrl[0] == '/'){
//解析后去掉最前面的 / 号,因为底层发布资源时会自动加 / 号,若连接成 // 后就无法加载到资源了
$publishUrl = substr($publishUrl, 1);
}
}catch(\yii\base\InvalidParamException $e){
if(!YII_ENV_PROD){
throw $e;
}else{
Yii::error('无法解析资源 ' . $resourceAlias);
return '';
}
}
return $publishUrl;
}
}
则定义Assets包时继承这个重写的包就可以在资源里引用别名了