资源版本管理的优化 - 资源包支持别名

  • 作者: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包时继承这个重写的包就可以在资源里引用别名了