vendor/assetic/docs/en/concepts.md
author cavaliet
Mon, 07 Jul 2014 17:23:47 +0200
changeset 122 d672f7dd74dc
parent 0 7f95f8617b0b
permissions -rwxr-xr-x
Added tag V00.17 for changeset ada5f3d8b5b4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
In order to use the Assetic OOP API you must first understand the two central
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
concepts of Assetic: assets and filters.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
### What is an Asset?
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
As asset is an object that has content and metadata which can be loaded and
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
dumped. Your assets will probably fall into three categories: Javascripts,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
stylesheets and images. Most assets will be loaded from files in your
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
filesystem, but they can also be loaded via HTTP, a database, from a string,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
or virtually anything else. All that an asset has to do is fulfill Assetic's
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
basic asset interface.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
### What is a Filter?
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
A filter is an object that acts upon an asset's content when that asset is
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
loaded and/or dumped. Similar to assets, a filter can do virtually anything,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
as long as it implements Assetic's filter interface. 
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
Here is a list of some of the tools that can be applied to assets using a
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
filter:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
 * CoffeeScript
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
 * CssEmbed
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
 * CssMin
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
 * Google Closure Compiler
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
 * jpegoptim
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
 * jpegtran
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
 * Less
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
 * LessPHP
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
 * optipng
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
 * Packager
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
 * pngout
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
 * SASS
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
 * Sprockets (version 1)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
 * Stylus
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
 * YUI Compressor
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
### Using Assets and Filters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
You need to start by creating an asset object. This will probably mean
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
instantiating a `FileAsset` instance, which takes a filesystem path as its
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
first argument:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    $asset = new Assetic\Asset\FileAsset('/path/to/main.css');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
Once you have an asset you can begin adding filters to it by calling
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
`ensureFilter()`. For example, you can add a filter that applies the YUI
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
Compressor to the contents of the asset:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    $yui = new Assetic\Filter\Yui\CssCompressorFilter('/path/to/yui.jar');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    $asset->ensureFilter($yui);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
Once you've added as many filters as you'd like you can output the finished
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
asset to the browser:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
    header('Content-Type: text/css');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
    echo $asset->dump();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
### Asset Collections
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
It is a good idea to combine assets of the same type into a single file to
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
avoid unnecessary HTTP requests. You can do this in Assetic using the
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
`AssetCollection` class. This class is just like any other asset in Assetic's
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
eyes as it implements the asset interface, but under the hood it allows you to
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
combine multiple assets into one.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    use Assetic\Asset\AssetCollection;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
    $asset = new AssetCollection(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
        new FileAsset('/path/to/js/jquery.js'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
        new FileAsset('/path/to/js/jquery.plugin.js'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
        new FileAsset('/path/to/js/application.js'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
    ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
### Nested Asset Collections
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
The collection class implements the asset interface and all assets passed into
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
a collection must implement the same interface, which means you can easily
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
nest collections within one another:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    use Assetic\Asset\AssetCollection;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
    use Assetic\Asset\GlobAsset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    use Assetic\Asset\HttpAsset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
    $asset = new AssetCollection(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
        new HttpAsset('http://example.com/jquery.min.js'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
        new GlobAsset('/path/to/js/*'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
The `HttpAsset` class is a special asset class that loads a file over HTTP;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
`GlobAsset` is a special asset collection class that loads files based on a
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
filesystem glob -- both implement the asset interface.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
This concept of nesting asset collection become even more powerful when you
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
start applying different sets of filters to each collection. Imagine some of
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
your application's stylesheets are written in SASS, while some are written in
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
vanilla CSS. You can combine all of these into one seamless CSS asset:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
    use Assetic\Asset\AssetCollection;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
    use Assetic\Asset\GlobAsset;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
    use Assetic\Filter\SassFilter;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
    use Assetic\Filter\Yui\CssCompressorFilter;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
    $css = new AssetCollection(array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
        new GlobAsset('/path/to/sass/*.sass', array(new SassFilter())),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
        new GlobAsset('/path/to/css/*.css'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
    ), array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
        new YuiCompressorFilter('/path/to/yuicompressor.jar'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
    ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
You'll notice I've also applied the YUI compressor filter to the combined
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
asset so all CSS will be minified.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
### Iterating over an Asset Collection
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
Once you have an asset collection you can iterate over it like you would a
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
plain old PHP array:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
    echo "Source paths:\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
    foreach ($collection as $asset) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        echo ' - '.$asset->getSourcePath()."\n";
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
The asset collection iterates recursively, which means you will only see the
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
"leaf" assets during iteration. Iteration also includes a smart filter which
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
ensures you only see each asset once, even if the same asset has been included
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
multiple times.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
Next: [Defining Assets "On The Fly"](define.md)