前端资源Assets发布后,其资源如图片的加载引用 [ 2.0 版本 ]
yii的资源包括“Yii中的资源是和Web页面相关的文件,可为CSS文件,JavaScript文件,图片或视频等”,文档中大段描述css文件和js文件的加载引用,未提到图片或视频等资源,应该怎样引用?
经过观察,发现实际在加载完成之后发现assets文件夹中已经复制有图片,或其他文件资源,但是这些资源是以加密过后的字符串生成的资源包,因此,只要获得这些资源包的url路径,就能够获得这些资源的引用。
资源包由一串加密的字符串命名,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"
...
}
...
lbmzorx
注册时间:2017-10-20
最后登录:2024-01-29
在线时长:189小时41分
最后登录:2024-01-29
在线时长:189小时41分
- 粉丝6
- 金钱15240
- 威望100
- 积分18130
共 3 条评论
请问Yii有没有控制图片输出质量的方法
不知道,也许可以用yii2-imagine拓展处理
这种方式岂不是每个视图都要这么配置一次变量,很是繁琐呀。yii2应该有更优的方式吧
等我找到了,我再告诉你,有大神知道的,也可以说说
@小仁爱书 已经有最佳答案了,请参考 balx的方法
http://www.yiichina.com/doc/guide/2.0/structure-assets#using-asset-bundles
Info:yii\web\AssetBundle::register() 方法返回资源包对象,该对象包含了发布资源的信息比如 basePath 或 baseUrl。
use app\assets\AppAsset;
$asset = AppAsset::register($this); // $this 代表视图对象
var_dump($asset->baseurl); //搞定!!!
最优答案!