和有些小伙伴一样,本人是从php转到了go,从事php时使用symfony框架一直享受其丰富的功能带来的便利,转到其他语言时比较直观的感觉就是twig真强,为什么其他语言没有扩展twig呢?
虽然前后端的开发模式,让模板引擎这个东西慢慢淡去,但是有时候还是需要用到这种东西,所以就有了,go调用php实现twig模板引擎的想法。
原理,go 通过exec.Command调用php,通过STDIN,STDOUT 方式进行数据交互
go在初始化阶段提供一些配置参数,比如模板引擎的为止,是否为开发环境等,php接收数据并初始化
初始换环境完毕后,当需要渲染模板,go再讲模板文件和数据以json字符串的形式写入STDIN告知php,
php接收到数据后,解析数据,选取指定的模板并渲染,然后通过STDOUT返回给go
这样一次渲染就结束了
整理好的文件打包在github上了
项目获取方式
go get github.com/sano100/go-php-twig
初始化
//1.设置配置参数
//--因为配置过环境变量这里使用php,否则请使用绝对路径
twig.ConfPhpFile = "php"
//--配置生成index.php脚本以及composer.json文件的位置
twig.ConfPhpDir = "D:/go_www/test/php"
//--配置模板缓存的位置
twig.ConfCacheDir = "D:/go_www/test/var/tmp"
//--配置模板文件*.twig的根目录
twig.ConfTwigDir = "D:/go_www/test/views"
//--配置是否为开发模式,
//----true:开发模式下仅开启1个php管道进程,twig模板文件修改后实时生效
//----false:生产环境下,根据ConfNumPipes启用多个php线程,并且模板使用缓存,
//----修改twig文件后需要先清空缓存才能生效,配合opcache可能有更佳性能表现
twig.ConfDev = true
//--配置开启几个php线程进行模板渲染,
//--todo 因为是随机分配,低并发情况可能会出现都挤在同一个线程等待的情况
twig.ConfNumPipes = 3
// go 与 php 通信是,总是以ConfHeader开头,以ConfFooter结束,
// 没有特殊原因无需配置,有默认值,ConfHeader和ConfFooter应该由良好的辨识度,且不能相同
//twig.ConfHeader = "[[go_php_piper_start]]"
//twig.ConfFooter = "[[go_php_piper_finish]]"
//创建运行所需的php代码
//--需要提前准备php环境和composer环境,
//--即 php -v 和 composer i 命令均能正常运行;
twig.CheckPHPFileOrCreate()//此方法安装后运行一次即可删除
//--CheckPHPFileOrCreate命令结束后还应切换到ConfPhpDir配置的目录执行composer i命令安装相关依赖
//初始化的部分,程序运行生命周期只运行一次
twig.Init()
模板渲染
//模板数据渲染
var data = make(map[string]string)
data["name"] = "this is name"
//模板路径说明:基于ConfTwigPath,“/”表示根目录,请使用绝对路径,相对路径会出错
//--使用模板嵌套时也一样{% extends "/main.twig" %},请使用绝对路径
rst := twig.Render("/index.twig", data)
println(rst)
如果喜欢就动动你的小手指点个赞,star一下吧!