lbmzorx 2017-10-26 13:02:41 6514次浏览 3条评论 1 0 0

yii的资源包括“Yii中的资源是和Web页面相关的文件,可为CSS文件,JavaScript文件,图片或视频等”,文档中大段描述css文件和js文件的加载引用,未提到图片或视频等资源,应该怎样引用?
经过观察,发现实际在加载完成之后发现assets文件夹中已经复制有图片,或其他文件资源,但是这些资源是以加密过后的字符串生成的资源包,因此,只要获得这些资源包的url路径,就能够获得这些资源的引用。
QQ拼音截图未命名.png
资源包由一串加密的字符串命名,yii\web\AssetManager发布资源时候调用其保护方法hash($path)生成

心急的直接在view视图引用:

use frontend\assets\YourAsset;
YourAsset::register($this);
$assets_url=$this->assetBundles[YourAsset::className()]->baseUrl;
//或者$assets_url=$this->getAssetManager()->getBundle(YourAsset::className())->baseUrl;

其中YourAsset是你自己定义的资源包。

echo $assets_url //  "/assets/89d0fe5a" 这一串url正是前端资源包的url

一个应用的例子...定义自己的资源包可以参考文档。

<?php
  use frontend\assets\YourAsset;
  YourAsset::register($this);
  $yourAssetUrl=$this->getAssetManager()->getBundle(YourAsset::className())->baseUrl;
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html>
<head>
  ...
    <?php $this->head() ?>
    ...
</head>
<body>
<?php $this->beginBody() ?>
    <img src="<?=$yourAssetUrl?>/img/1.jpg"><!--图片的引用-->
    ...
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>

简单的分析

简单的过程是:
在视图中注册YourAsset::register($this);之后,会把当前视图对象作为参数调用
yii\web\AssetBundle::register($view);
这个函数的唯一功能就是调用视图对象的$view->registerAssetBundle()函数,并将YouAsset类名作为参数传递过去,在registerAssetBundle()函数中,保存YouAsset对象到assetBundles属性中,如果资源还未发布,就调用getAssetManager()利用\yii\web\AssetManager对象发布,因此使用getAssetManager()同样能获取到资源包。
可以把view视图的assetBundles属性var_dump()出来,就更加清晰。

object(yii\web\View)#51 (20) {
  ["assetBundles"]=>
  array(4) {
    ["frontend\assets\AppAsset"]=>
    object(frontend\assets\AppAsset)#70 (9) {
      ["sourcePath"]=>
      string(72) "D:/wwwServer/advanced/frontend/web/css"
      ["baseUrl"]=>
      string(16) "/assets/89d0fe5a"
      ...
    }
    ["yii\web\YiiAsset"]=>
    object(yii\web\YiiAsset)#74 (9) {
      ["sourcePath"]=>
      string(82) "D:\wwwServer\advanced\vendor\yiisoft\yii2/assets"        
      ["basePath"]=>
      string(84) "D:\wwwServer\advanced\frontend\web\assets\ee29c479"
      ["baseUrl"]=>
      string(16) "/assets/ee29c479"
       ...
    }
    ["yii\web\JqueryAsset"]=>
    object(yii\web\JqueryAsset)#76 (9) {
      ["sourcePath"]=>
      string(80) "D:\wwwServer\advanced/vendor\bower/jquery/dist"         
      ["basePath"]=>
      string(84) "D:\wwwServer\advanced\frontend\web\assets\a6b7dc25"
      ["baseUrl"]=>
      string(16) "/assets/a6b7dc25"
    ...
    }
    ...
您需要登录后才可以评论。登录 | 立即注册