我们程序所使用的css / js / img 都叫做资源,如何有效的管理是个问题,AssetBundle(资源类)就是管理这个事情的。
我们建立一系列继承于AssetBundle的资源类,并且把他们放到@app\assets下,当某个布局或视图要使用的时候,注册一下就可以了。
先来偷窥下AssetBundle的样子,建立一个yii程序后打开@app\assets\AppAsset文件。
namespace app\assets;
use yii\web\AssetBundle;
/**
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0
*/
class AppAsset extends AssetBundle
{
public $basePath = '@webroot';
public $baseUrl = '@web';
public $css = [
'css/site.css',
];
public $js = [
];
public $depends = [
'yii\web\YiiAsset',
'yii\bootstrap\BootstrapAsset',
];
}
对,这就是一个资源类,我们也可以自己建立比如AdminAsset、WechatAsset等等。
从AppAsset里你我都可以直观的理解以下事情
- 我们可以在$css数组里写入相关的css文件
- 我们可以在$js数组里写入相关的js文件
- 我们定义的Asset可以依赖于另外一个Asset类
到这里,一个简单的应用就可以了,不过这些非本文内容,我们要更深的理解它,先列目录
- 什么是资源位置
- 定义一个可发布的资源类
什么是资源位置
了解yii对资源位置的定义将有利于我们学习资源类的发布
- 源资源: 资源文件和PHP源代码放在一起,不能被Web直接访问, 为了使用这些源资源,它们要拷贝到一个可Web访问的Web目录中成为发布的资源,这个过程称为发布资源,就是我们今天要讲的。
- 发布的资源: 资源文件放在可通过Web直接访问的Web目录中;
- 外部资源: 资源文件放在与你的Web应用不同的 Web服务器上;
对于发布的资源和外部资源比较好理解,Asset类会将其直接渲染到视图中,而源资源我们要注意下,它在程序目录下(不可访问),那么我们的Asset是如何将源资源转移到web目录下就是一个技术问题了。
yii的约定如下:必须设置sourcePath属性, 其路径的资源会被当作源资源,否则就表示这些资源为发布的资源,当然我们也需要置顶basePath告知将来资源文件所在的web目录。
定义一个可发布的资源类
例子永远是最好的老师,我们现在就开始定义一个源资源并且将其发布到web目录下。
我们的@app下有这样的一个文件夹,我们计划将test下的css文件夹及内容、fonts文件夹及内容、test.js文件发布到web/assets下,不传img文件夹。
我们先构建一个资源类@app\assets\PAsset.php
namespace app\assets;
use yii\web\AssetBundle;
use yii\web\View;
class PAsset extends AssetBundle
{
public $sourcePath = '@app/res/test';
public $jsOptions = [
'position'=>View::POS_HEAD
];
public $publishOptions = [
'only' => [
'fonts/*',
'css/*',
'test.js'
],
'except'=>[
'img'
]
];
}
首先设置$sourcePath,将其源资源目录指定到@app/res/test,这些代码将用于转移。
根据需求,我们要转移css和fonts文件夹,排除img文件夹,因此我们需要对$publishOptions的数组进行配置,使用only和except进行。
这里要注意一个问题,如果我们只是设置了only但是不except img,则img文件夹依然会被转移(但是img里的内容不会转移),所以务必要设置except。
另外你一定注意到了,如果你想转移一个文件夹fonts下所有文件,可以使用*字符。
到此为止你已经建立了一个可以发布的资源类,接下来只需要在相应布局或视图里注册它。
use app\assets\PAsset;
PAsset::register($this);
然后你会发现文件已经被转移到/web/assets,搞定。
当然yii的asset要比这强大的多,后续将陆续为你讲解资源的依赖、浏览器兼容、压缩等等功能。
北哥工兵连 http://nai8.me