Phalcon资源文件管理(Assets Management)

资源文件管理(Assets Management)

Phalcon\Assets是一个让开发人员管理静态资源的组件,如管理css,javascript等。javascript

 Phalcon\Assets\Manager 存在于DI容器中,因此咱们可以在服务容器存在的 不论什么地方使用它来加入/管理资源。php

加入资源(Adding Resources)

Assets支持两个内置的资源管理器:css和javascripts.咱们可以依据需要建立其余的资源。资源管理器内部保存了两类资源集合一为 javascript还有一为css.css

咱们可以很easy的向这两个集合里加入资源。例如如下:html

<?php

class IndexController extends Phalcon\Mvc\Controller
{
    public function index()
    {

        //加入本地css资源
        $this->assets
            ->addCss('css/style.css')
            ->addCss('css/index.css');

        //加入本地js资源
        $this->assets
            ->addJs('js/jquery.js')
            ->addJs('js/bootstrap.min.js');

    }
}

而后咱们可以在视图中输出资源:java

<html>
    <head>
        <title>Some amazing website</title>
        <?php $this->assets->outputCss() ?>
    </head>
    <body>

        <!-- ... -->

        <?php $this->assets->outputJs() ?

> </body> <html> jquery

Volt语法:web

<html>
    <head>
        <title>Some amazing website</title>
          {{ assets.outputCss() }}
    </head>
    <body>

        <!-- ... -->

          {{ assets.outputJs() }}
    </body>
<html>

本地与远程资源(Local/Remote resources)

本地资源是同一应用中的资源,这些资源存在于应用的根文件夹中。 Phalcon\Mvc\Url 用来生成 本地的url. 远程资源便是一种存在于CDN或其余远程server上的资源。比方常常使用的jquery, bootstrap等资源。bootstrap

<?php

public function indexAction()
{

    //加入远程及本地资源
    $this->assets
        ->addCss('//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.1/css/bootstrap-combined.min.css', true )
        ->addCss('css/style.css', false );
}

集合(Collections)

集合便是把一同类的资源放在一些。资源管理器隐含的建立了两个集合:css和js. 固然咱们可以建立其余的集合以归类其余的资源。 这样咱们可以很是easy的 在视图里显示:api

<?

php //html头部的js资源 $this->assets ->collection('header') ->addJs('js/jquery.js') ->addJs('js/bootstrap.min.js'); //html尾部的js资源 $this->assets ->collection('footer') ->addJs('js/jquery.js') ->addJs('js/bootstrap.min.js'); 浏览器

而后在视图中例如如下使用:

<html>
    <head>
        <title>Some amazing website</title>
        <?

php $this->assets->outputJs('header') ?

> </head> <body> <!-- ... --> <?php $this->assets->outputJs('footer') ?> </body> <html>

Volt语法:

<html>
    <head>
        <title>Some amazing website</title>
          {{ assets.outputCss('header') }}
    </head>
    <body>

        <!-- ... -->

          {{ assets.outputJs('footer') }}
    </body>
<html>

前缀(Prefixes)

集合可以加入前缀,这可以实现很easy的更换server:

<?

php $scripts = $this->assets->collection('footer'); if ($config->environment == 'development') { $scripts->setPrefix('/'); } else { $scripts->setPrefix('http:://cdn.example.com/'); } $scripts->addJs('js/jquery.js') ->addJs('js/bootstrap.min.js');

咱们也可以使用链式语法,例如如下:

<?

php $scripts = $assets ->collection('header') ->setPrefix('http://cdn.example.com/') ->setLocal(false) ->addJs('js/jquery.js') ->addJs('js/bootstrap.min.js');

压缩与过滤(Minification/Filtering)

Phalcon\Assets提供了内置的js及css压缩工具。

开发人员可以设定资源管理器以肯定对哪些资源进行压缩啊些资源不进行压缩。

除了上面这些以外 咱们还可以使用Douglas Crockford书写的Jsmin压缩工具,及Ryan Day提供的CSSMin来对js及css文件进行压缩. 如下的样例中展现了怎样使用集合对资源文件进行压缩:

<?php

$manager

    //这些javascript资源位于html文件的底部
    ->collection('jsFooter')

    //终于输出名
    ->setTargetPath('final.js')

    //使用此uri显示资源
    ->setTargetUri('production/final.js')

    //加入远程资源但不压缩
    ->addJs('code.jquery.com/jquery-1.10.0.min.js', true, false)

    //这些资源必须要压缩
    ->addJs('common-functions.js')
    ->addJs('page-functions.js')

    //把这些资源放入一个文件内
    ->join(true)

    //使用内置的JsMin过滤器
    ->addFilter(new Phalcon\Assets\Filters\Jsmin())

    //使用本身定义过滤器
    ->addFilter(new MyApp\Assets\Filters\LicenseStamper());

開始部分咱们经过资源管理器取得了一个命名的集合,集合中可以包括javascript或css资源但不能同一时候包括两个。一些资源可能位于远程的server上 这上结资源咱们可以经过http取得。为了提升性能建议把远程的资源取到本地来。以下降载入远程资源的开销。

<?php

//这些Javscript文件放在页面的底端
$js = $manager->collection('jsFooter');

如上面,addJs方法用来加入资源到集合中,第二个參数指示了资源是否为外部的,第三个參数指示是否需要压缩资源:

<?php

//加入远程资源但不压缩
$js->addJs('code.jquery.com/jquery-1.10.0.min.js', true, false);

// These are local resources that must be filtered
//加入本地资源并压缩
$js->addJs('common-functions.js');
$js->addJs('page-functions.js');

过滤器被注冊到集合内。咱们可以注冊我个过滤器,资源内容被过滤的顺序和过滤器注冊的顺序是同样的。

<?php

//使用内置的Jsmin过滤器
$js->addFilter(new Phalcon\Assets\Filters\Jsmin());

//使用本身定义的过滤器
$js->addFilter(new MyApp\Assets\Filters\LicenseStamper());

注意:不管是内置的仍是本身定义的过滤器对集合来讲他们都是透明的。最后一步用来肯定所有写到同一个文件里仍是分开保存。

假设要让集合中所有的文件合成 一个文件仅仅需要使用join函数:

<?php

//全并文件
$js->join(true);

//设置终于输出文件
$js->setTargetPath('public/production/final.js');

//使用此uri引用js
$js->setTargetUri('production/final.js');

假设资源写入同一文件,则咱们需要定义使用哪个文件来保存要写入的资源数据。及使用一个ur来展现资源。这两个设置可以使用setTargetPath() 和setTargetUri()两个函数来配置。

内置过滤器(Built-In Filters)

Phalcon内置了两个过滤器以分别实现对js及css的压缩,由于两者是使用c实现的故极大的下降了性能上的开销:

过滤器 说明
Phalcon\Assets\Filters\Jsmin 压缩Javascript文件即去除掉javascript解释器/编译器忽略的一些字符
Phalcon\Assets\Filters\Cssmin 压缩css文件即去除掉浏览器在渲染css时不需要的一些字符

本身定义过滤器(Custom Filters)

除了使用Phalcon内置的过滤器外,开发人员还可以建立本身的过滤器。

这样咱们就可以使用YUI_, Sass, Closure,等。

<?php

use Phalcon\Assets\FilterInterface;

/**
 * 使用YUI过滤css内容
 * @param string $contents
 * @return string
 */
class CssYUICompressor implements FilterInterface
{

    protected $_options;

    /**
     * CssYUICompressor 构造函数
     *
     * @param array $options
     */
    public function __construct($options)
    {
        $this->_options = $options;
    }

    /**
     * 运行过滤
     * @param string $contents
     * @return string
     */
    public function filter($contents)
    {

        //保存字符吕内容到暂时文件里
        file_put_contents('temp/my-temp-1.css', $contents);

        system(
            $this->_options['java-bin'] .
            ' -jar ' .
            $this->_options['yui'] .
            ' --type css '.
            'temp/my-temp-file-1.css ' .
            $this->_options['extra-options'] .
            ' -o temp/my-temp-file-2.css'
        );

        //返回文件内容
        return file_get_contents("temp/my-temp-file-2.css");
    }
}

使用方法:

<?php

//取css集合
$css = $this->assets->get('head');

//加入/启用YUI压缩器
$css->addFilter(new CssYUICompressor(array(
     'java-bin' => '/usr/local/bin/java',
     'yui' => '/some/path/yuicompressor-x.y.z.jar',
     'extra-options' => '--charset utf8'
)));

本身定义输出(Custom Output)

OutputJs及outputCss方法可以根据不一样的资源类来建立需要的html代码。

咱们可以重写这种方法或是手动的输出这些资源方法例如如下:

<?php

foreach ($this->assets->collection('js') as $resource) {
    echo \Phalcon\Tag::javascriptInclude($resource->getPath());
}
相关文章
相关标签/搜索