我们程序所使用的css / js / img 都叫做资源,如何有效的管理是个问题,AssetBundle(资源类)就是管理这个事情的。

我们建立一系列继承于AssetBundle的资源类,并且把他们放到@appassets下,当某个布局或视图要使用的时候,注册一下就可以了。

先来偷窥下AssetBundle的样子,建立一个yii程序后打开@appassetsAppAsset文件。

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类

到这里,一个简单的应用就可以了,不过这些非本文内容,我们要更深的理解它,先列目录

  1. 什么是资源位置

  2. 定义一个可发布的资源类

什么是资源位置

了解yii对资源位置的定义将有利于我们学习资源类的发布

  • 源资源: 资源文件和PHP源代码放在一起,不能被Web直接访问, 为了使用这些源资源,它们要拷贝到一个可Web访问的Web目录中成为发布的资源,这个过程称为发布资源,就是我们今天要讲的。

  • 发布的资源: 资源文件放在可通过Web直接访问的Web目录中;

  • 外部资源: 资源文件放在与你的Web应用不同的 Web服务器上;

对于发布的资源和外部资源比较好理解,Asset类会将其直接渲染到视图中,而源资源我们要注意下,它在程序目录下(不可访问),那么我们的Asset是如何将源资源转移到web目录下就是一个技术问题了。

yii的约定如下:必须设置sourcePath属性, 其路径的资源会被当作源资源,否则就表示这些资源为发布的资源,当然我们也需要置顶basePath告知将来资源文件所在的web目录。

定义一个可发布的资源类

例子永远是最好的老师,我们现在就开始定义一个源资源并且将其发布到web目录下。

alt

我们的@app下有这样的一个文件夹,我们计划将test下的css文件夹及内容、fonts文件夹及内容、test.js文件发布到web/assets下,不传img文件夹。

我们先构建一个资源类@appassetsPAsset.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


阿北
4.1k 声望913 粉丝

引用和评论

0 条评论