标签 blade 下的文章

开篇

在博客开博之前,我就写了一篇:新平台,启用blade模板,是的,你看到的现在的皮肤感觉和官方没有两样,其实是我使用blade模板完全重新制作了一份。

Blade模板功能介绍

目录结构:

.
|____functions.php
|____404.php
|____index.php
|____archive.php
|____cache
| |____.gitignore
|____post.php
|____grid.css
|____screenshot.png
|____img
| |____icon-search.png
| |____icon-search@2x.png
|____style.css
|____page.php
|____views
| |____index.blade.php
| |____404.blade.php
| |____comments.blade.php
| |____post.blade.php
| |____page.blade.php
| |____archive.blade.php
| |____sidebar.blade.php
| |____layouts.blade.php
|____normalize.css
|____blade.php

抛开css/image和functions.php这些内容不看,你看到的,似于是和官方的相比只多了两个目录+一个blade.php文件,这其中,cache是blade用来生成编译后的缓存目录,views目录就是我们的blade模板。

Blade

打开blade.php,会发现其中的代码不多,就几行

<?php
if (!defined('__TYPECHO_ROOT_DIR__')) {
    exit;
}
if (!class_exists('TypechoPlugin\BladeOne') && !Typecho\Plugin::exists('Blade')) {
    exit('请先启用Blade模板插件');
}

use TypechoPlugin\BladeOne;


try {
    $views = __DIR__.'/views';
    $cache = __DIR__.'/cache';
    $blade = new BladeOne($views, $cache, BladeOne::MODE_DEBUG);
    $blade->includeScope = true;
    $blade->pipeEnable = true;
    $blade->setBaseUrl($this->options->themeUrl);
    echo $blade->run((isset($viewFile) ? $viewFile : 'index'), [
        'view'      => $this,
        'options'   => $this->options,
        'user'      => $this->user,
//        'converter' => $converter,
    ]);
} catch (Exception $e) {
    exit($e->getMessage());
}

这个BladeOne,来自于EFTEC/BladeOne,这个模板是我从yii时代就开始用了,因为那时候用过laravel后,就感觉离不开这玩意了,于是我就自己抠了一份laravel的blade库,但后面发现要改的内容太多了,这时候发现了这个EFTEC/BladeOne后,就在非laravel项目中使用上了它。

对于普通用户来说,我们只需要下载他的lib目录下的BladeOne.php这一个文件就行了,如果你不想单独写插件,就将文件放到usr/plugins目录下,同时修改一下BladeOne.php的命名空间,以及对应HelloWorld插件的标准typecho插件注释,这时候你到后台管理插件模块下,你就会发现BladeOne是一个即插即用插件了。

插件是启用了,但模板并不知道,对吧?所以我们在blade.php中加了一个判断 if (!class_exists('TypechoPlugin\BladeOne') || !Typecho\Plugin::exists('Blade')),如果没有引入Blade,就直接不能使用,这样也挺方便。

在上面的blade.php中,有几个变量和参数

$views / $cache 代表了模板目录和编译后的缓存目录,这个可以自己随便定义,我只是用了一个相对标准的目录罢了
BladeOne的第三个参数,默认是使用BladeOne::MODE_DEBUG,事实上他有4个参数,如果觉得没问题或者已经修改的很稳定了。就使用MODE_FAST,否则MODE_AUTO也OK

接下来的三个参数就是blade中的用法了

$blade->includeScope = true。这个默认是false,你也可以删除这一行,删除后,传入的变量就只能在当前的blade模板里使用。https://github.com/EFTEC/BladeOne/wiki/Template-inheritance
$blade->pipeEnable 在linux下面大家都知道,管道的用法,例如最常见的 cat xxx.log|grep "php",这个也是类似的用法,比如 {{$name | ucwords }}就可以直接首字母大写了,是不是很方便?
$blade->setBaseUrl($this->options->themeUrl),这个是为了使用 @asset / @relative等方法,参考:asset官方用法,一般情况下,我们其实不会调用其他项目目录里的文件,所以 @asset就足够了,例如当前目录下的 img/logo.png,正常写法是 <?php echo $this->options->themeUrl('img/logo.png');?> ,在使用 blade并且设置了baseUrl时,就可以 @asset('img/logo.png'),一个模板文件下来,至少少写上百个字符了。

最重要的赋值

    echo $blade->run((isset($viewFile) ? $viewFile : 'index'), [
        'view'      => $this,
        'options'   => $this->options,
        'user'      => $this->user,
    ]);

在这里我定义了一个变量$viewFile,如果这个变量不存在,默认就是使用index.blade.php模板,然后传入了3个参数 view/options/user,因为这三个变量确实是几乎每个模板都会用得到。为什么要传入呢?主要还是由于blade已经不再是标准PHP模板了,所以他里面就不能用 $this 变量(以前在Yii中也是这样的用法)

其他文件的写法

着重介绍完blade.php的内容,那么其他和官方模板一致文件名的内容又是怎样的呢?这里就只介绍index.php了

<?php
if (!defined('__TYPECHO_ROOT_DIR__')) {
    exit;
}
$viewFile = "index";
include 'blade.php';

LOOK,是不是很简单?去掉那个判断,其实就2行代码,甚至if判断都可以不需要,因为在blade.php中也有判断。这里其实就只定义一下$viewFile,代表告诉入口文件,我应该用哪个模板。

结尾

blade的引擎,刚才提到的BladeOne的github上面,有详细的用法,如果你觉得不够详细,也可以看laravel关于blade的文档
本篇就不做详细介绍了