ThinkPHP5 自定义模板标签

最近在使用ThinkPHP5 写项目,项目中涉及到权限管理,如果用户没有这个权限,就不显示这个div。在全局封装好了一个函数

check_permission($permission_key): bool{}

在view.html里面书写的话 需要这么写

{if check_permission('order-delivery')}
    <button>订单发货</button>
{/if}

想换一种思路实现以上代码,于是自己研究了一下模板标签拓展,拓展类库如下:

class HasPermission extends TagLib
{
    protected $tags = [
        //闭合标签,默认为不闭合
        'open' => ['attr' => 'key', 'close' => 0],
        'close' => ['attr' => 'key', 'close' => 1],
    ];

    public function tagClose($tag, $content)
    {
        $parse = '<?php if (has_permission("' . $tag['key']
            . '")) {?>' . $content . '<?php } ?>';
        return $parse;
    }
}

需要在/config/template.php中的taglib_pre_load中加入HasPermission

use app\index\taglib\HasPermission;

return [
    // 模板引擎类型 支持 php think 支持扩展
    'type' => 'Think',
    // 模板路径
    'view_path' => '',
    // 模板后缀
    'view_suffix' => 'html',
    // 模板文件名分隔符
    'view_depr' => DIRECTORY_SEPARATOR,
    // 模板引擎普通标签开始标记
    'tpl_begin' => '{',
    // 模板引擎普通标签结束标记
    'tpl_end' => '}',
    // 标签库标签开始标记
    'taglib_begin' => '{',
    // 标签库标签结束标记
    'taglib_end' => '}',
    'tpl_replace_string' => [
        // 静态文件路径
        '__STATIC__' => '/static',
        '__JS__' => '/static/javascript',
    ],
    'taglib_pre_load' => implode(',', [
        HasPermission::class,
    ]),
];

这里我要吐槽一下ThinkPHP5的设计,为什么taglib_pre_load 是一个逗号分隔开的字符串,而不是优雅的数组

在view.html中实现这个方法示例:

{haspermission:close key="order-delivery"}
    <button>订单发货</button>
{/haspermission:close}

写完之后发现,其实好像没少写多少代码,笑。。。