registerPlugin自定义插件
插件可以更丰富我们的Sdopx 模板引擎,在开发中我们可能需要定制自己的插件功能,使用 Sdopx::registerPlugin 注册我们定义的插件。
Sdopx 的插件分为,单标签插件如 {plugin} 还有 闭合标签插件 {tag}{/tag} 两种,使用 registerPlugin 注册的插件 只能注册单单标签插件,如果是闭合标签插件,使用 registerTag 来进行注册。
编写插件
插件的定义和命名规则:
插件在 Sdopx 模板引擎中是一个类,应该实现 sdopx\interfaces\Plugin ,但是并不要强制要求以代码接口实现的形式书写代码。
下面使用一个例子来介绍如何自定义一个 插件:
hello 插件:
<?php
define('ROOT_DIR', __DIR__);
date_default_timezone_set('PRC');
require(ROOT_DIR . '/vendor/autoload.php');
use sdopx\lib\Outer;
use sdopx\Sdopx;
Sdopx::$defaultTemplateDirs = './view';
Sdopx::$defaultCompileDir = './runtime';
//class HelloPlugin implements \sdopx\interfaces\Plugin 也是可以的
class HelloPlugin
{
/**
* 渲染
* @param array $params 这个参数 是来自模板插件传递过来的属性参数值
* @param \sdopx\lib\Outer $outer 用于输出内容或者抛出错误的输出对象
*
*
*/
public function render(array $params, Outer $outer)
{
$name = isset($params['name']) ? $params['name'] : '';
if ($name == '') {
$outer->throw('名字必须填写');
}
$outer->text('hello ' . $name);
//如果你不希望输出内容被html实体编码,可以使用 $outer->html('hello <b>' . $name.'</b>');
}
}
//注意 提供的是 实例
Sdopx::registerPlugin('hello', new HelloPlugin());
$sdopx = new Sdopx();
$sdopx->assign('name', 'wj008');
$sdopx->display('index.tpl');
Outer 说明:
//说明:sdopx\lib\Outer 提供了一些方法,以及可以获得模板对象。
$outer->sdopx //php 代码中的 $sdopx 对象
//如需要设置插件缓存值等
$outer->sdopx->_cache['name']='xxx';
$outer->text($code) // 会转成html实体输出,防止xss 漏洞攻击,建议使用。
$outer->html($code) // 原样输出 html 代码。
$outer->throw($error) // 抛出异常,使用该方法抛出异常在调试模式下会自动附上模板错误位置,建议使用。
注意:我们在模板插件开发中,所有的输出均使用 sdopx\lib\Outer 进行输出,不可使用 系统自带的 echo print 等方法输出。
模板使用:
{hello name=$name}
输出:
hello wj008
自动装载插件
为了方便插件维护和管理,我们可能不需要每次实现一个插件都使用 Sdopx::registerPlugin 来主动注册插件,所以 Sdopx 提供了一些方法用于自动载入我们编写的插件。
1 需要被自动载入的插件命名要求。
需要自动载入的插件命名必须为大驼峰形式的类名 其类名后缀必须是 Plugin 结尾,文件名与类名必须保持一致。
如:
class Hello //无效,没有以Plugin 结尾,找不到。
class helloPlugin //无效,类名不是大驼峰,找不到。
class My_namePlugin //无效,类名不可出现下划线。
class MyNamePlugin //有效,但是 插件使用时是 {my_name} 而不是 {myName} 或者 {myname}
class HelloPlaugin // 有效 插件使用是 {hello}
文件名 如 HelloPlugin.php
2 需要被自动载入的插件 命名空间必须是 namespace sdopx\plugin;
Sdopx 是有命名空间要求的,所以需要被自动载入插件的类,必须是在 sdopx\plugin 下的。
如:
HelloPlugin.php
namespace sdopx\plugin;
use sdopx\lib\Outer;
class HelloPlugin
{
public function render(array $params, Outer $outer)
{
$outer->text('hello');
}
}
3 需要被自动载入的插件 存放位置要求。
如果 你使用的是 composer 自动加载路径,那么 你只要在你的 composer.json 文件中指定 sdopx/plugin 命名空间的对应目录即可。
如:
composer.json
{
.... 你的其他配置信息
"autoload": {
"psr-4": {
"sdopx\\plugin\\": "myplugin",
}
},
.... 你的其他配置信息
}
这个时候 你可以把你的插件放入跟目录下的 myplugin 文件夹中,并且运行 composer update
如果上例子 存放路径为 /myplugin/HelloPlugin.php
如果你不使用 composer 那么 你需要用 Sdopx::setPluginDir(); 来设置你插件的存放路径
使用代码如下:
define('ROOT_DIR', __DIR__);
date_default_timezone_set('PRC');
require(ROOT_DIR . '/sdopx/Sdopx.php');
use sdopx\Sdopx;
Sdopx::$defaultTemplateDirs = './view';
Sdopx::$defaultCompileDir = './runtime';
//设置自定义插件存放路径
Sdopx::setPluginDir('./myplugin');
$sdopx = new Sdopx();
$sdopx->assign('name', 'wj008');
$sdopx->display('index.tpl');
在这里 我们依然建议您使用 composer 的方式自动载入命名空间。