Phalcon资源文件管理(Assets Management)

资源文件管理(Assets Management)

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

 PhalconAssetsManager 存在于DI容器中,所以我们能够在服务容器存在的 不论什么地方使用它来加入/管理资源。

加入资源(Adding Resources)

Assets支持两个内置的资源管理器:css和javascripts.我们能够依据须要创建其他的资源。资源管理器内部保存了两类资源集合一为 javascript还有一为css.

我们能够很easy的向这两个集合里加入资源。例如以下:

<?php

class IndexController extends PhalconMvcController
{
    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');

    }
}

然后我们能够在视图中输出资源:

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

        <!-- ... -->

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

> </body> <html>

Volt语法:

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

        <!-- ... -->

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

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

本地资源是同一应用中的资源,这些资源存在于应用的根文件夹中。 PhalconMvcUrl 用来生成 本地的url. 远程资源即是一种存在于CDN或其他远程server上的资源。比方经常使用的jquery, 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的 在视图里显示:

<?

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)

PhalconAssets提供了内置的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 PhalconAssetsFiltersJsmin())

    //使用自己定义过滤器
    ->addFilter(new MyAppAssetsFiltersLicenseStamper());

開始部分我们通过资源管理器取得了一个命名的集合,集合中能够包括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 PhalconAssetsFiltersJsmin());

//使用自己定义的过滤器
$js->addFilter(new MyAppAssetsFiltersLicenseStamper());

注意:无论是内置的还是自己定义的过滤器对集合来说他们都是透明的。最后一步用来确定全部写到同一个文件里还是分开保存。

假设要让集合中全部的文件合成 一个文件仅仅须要使用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实现的故极大的降低了性能上的开销:

过滤器 说明
PhalconAssetsFiltersJsmin 压缩Javascript文件即去除掉javascript解释器/编译器忽略的一些字符
PhalconAssetsFiltersCssmin 压缩css文件即去除掉浏览器在渲染css时不须要的一些字符

自己定义过滤器(Custom Filters)

除了使用Phalcon内置的过滤器外,开发人员还能够创建自己的过滤器。

这样我们就能够使用YUI_, Sass, Closure,等。

<?php

use PhalconAssetsFilterInterface;

/**
 * 使用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 PhalconTag::javascriptInclude($resource->getPath());
}
原文地址:https://www.cnblogs.com/zfyouxi/p/5144947.html