Phalcon资源文件管理(Assets Management)

资源文件管理(Assets Management)

Phalcon\Assets是一个让开发者管理静态资源的组件,如管理css,javascript等。 Phalcon\Assets\Manager 存在于DI容器中,所以我们可以在服务容器存在的 任何地方使用它来添加/管理资源。

添加资源(Adding Resources)

Assets支持两个内置的资源管理器:css和javascripts.我们可以根据需要创建其它的资源。资源管理器内部保存了两类资源集合一为 javascript另一为css.

我们可以非常简单的向这两个集合里添加资源,如下:

<?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');

    }
}

然后我们可以在视图中输出资源:

<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)

本地资源是同一应用中的资源,这些资源存在于应用的根目录中。 Phalcon\Mvc\Url 用来生成 本地的url. 远程资源即是一种存在于CDN或其它远程服务器上的资源,比如常用的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. 当然我们可以创建其它的集合以归类其它的资源, 这样我们可以很容易的 在视图里显示:

<?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)

集合可以添加前缀,这可以实现非常简单的更换服务器:

<?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资源但不能同时包含两个。一些资源可能位于远程的服务器上 这上结资源我们可以通过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());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Phalcon 中文文档 一般都是直接看英文料,大都能看得懂。但看到Phalcon框架如此优秀,在学习后就想和大家分享,但发现国内的人几乎没有使用的,故想翻译一下,一旦翻译才发现读懂和译出一篇好文章真的不太一样。 故前一期翻译的部分章节有点生硬,等有空的时候再回头重译吧,后面的一部分也是以英文文档为基础,但并不再是逐句翻译了。 09年左右,大量的框架出现,我看过的框架不下20种,最先看到的可能就是php.MVC了,这是一个按照struts 1x编写的,只不过同时加载的类库太多了,效率不高而且不太完善。 后来稍有名的包括 cakephp, Symfony, Akelos, Prado, Kohana等,最近几年流行的就是 zf, yii, ci等,当然还有国内几个比较有名的框架,如fleaphp, thinkphp等。 在上面的一些框架中,我比较感冒的还是ci,yii,thinkphp等。ci,thinkphp够简单,速度也不错。yii是生活在国外的华人开发,功能够全而强大,速度也不错,国内的应用也不少。 一直不太喜欢zf,记得几年前就和同行朋友聊天的时候说,像ZEND公司完全可以用C语言开发出一个扩展来,这样效率会高得多,为毛非得用PHP开发呢,事实被我验证了,但开发扩展的不是ZEND公司,而是国内一个PHP大鸟,人称鸟哥。这个框架就是非常出名的YAF,因此YAF扩展是我必装的扩展之一。同时这也是我发现的第一个C语言写的扩展框架。 但YAF的缺点是,功能非常不完善,在我看来只是简单实现了MVC结构及路由,分发等功能,像一些ORM之类的功能完全没有开发,作者好像也没有开发的意思:) 后来就发现了Phalcon,一看文档就爱上了她,功能,速度等都是我想要的,我花了一周时间看文档学习她,并在一个下午的过程中,发现了文档中的三个错误并提交了这些错误:),我决定为完善它也贡献一点自己的力量。 本文档的中文地址存放在 http://phalcon.5iunix.net Github上的地址为: https://github.com/netstu/phalcondocs ,您如果发现有些地方译的有些操蛋,烦请你fork它,并完善她。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值