volcanus / template-renderer
某些模板系统的渲染类
3.0.1
2023-02-03 05:14 UTC
Requires
- php: ^8.1
- psr/http-message: ~1.0
Requires (Dev)
- ext-simplexml: *
- laminas/laminas-diactoros: ^2.9
- latte/latte: ^3.0
- phptal/phptal: ^1.7
- phpunit/phpunit: ^9.5
- smarty/smarty: ^4.3
README
这是一个PHP类库,用于通过通用接口使用各种模板引擎。
兼容环境
- PHP 8.1及以后版本
- Smarty(可选)
- Latte (可选)
- PHPTAL(可选)
版本的下限不明确。抱歉。
使用方法
Smarty
<?php include './vendor/autoload.php'; use Volcanus\TemplateRenderer\Renderer; use Volcanus\TemplateRenderer\Adapter\SmartyAdapter; // Smarty $renderer = new Renderer(new SmartyAdapter(new \Smarty(), [ 'template_dir' => __DIR__, 'compile_dir' => sys_get_temp_dir(), ])); $renderer->assign('suffix', '様'); file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.tpl', 'Hello {$name}{$suffix} !!'); $renderer->render('hello.tpl', ['name' => 'Smarty']); // Hello Smarty様 !! unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.tpl');
Latte
<?php include './vendor/autoload.php'; use Volcanus\TemplateRenderer\Renderer; use Volcanus\TemplateRenderer\Adapter\LatteAdapter; // Latte $renderer = new Renderer(new LatteAdapter(new \Latte\Engine(), [ 'baseDir' => __DIR__, 'tempDirectory' => sys_get_temp_dir(), ])); $renderer->assign('suffix', '様'); file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.latte', 'Hello {$name}{$suffix} !!'); $renderer->render('hello.latte',['name' => 'Latte']); // Hello Latte様 !! unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.latte');
PHPTAL
<?php include './vendor/autoload.php'; use Volcanus\TemplateRenderer\Renderer; use Volcanus\TemplateRenderer\Adapter\PhpTalAdapter; // PHPTAL $renderer = new Renderer(new PhpTalAdapter(new \PHPTAL(), [ 'templateRepository' => __DIR__, 'phpCodeDestination' => sys_get_temp_dir(), ])); $renderer->assign('suffix', '様'); file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.tal', '<tal:block>Hello <span tal:replace="name">Anonymous</span><span tal:replace="suffix">氏</span> !!</tal:block>'); $renderer->render('hello.tal', ['name' => 'PHPTAL']); // Hello PHPTAL様 !! unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.tal');
适配器的注意事项
基本上,它不提供对复杂设置或像插件这样的自定义机制的直接访问。
Smarty
它支持以下设置值。
- template_dir, config_dir, plugins_dir, compile_dir, cache_dir, left_delimiter, right_delimiter, default_modifiers, caching, force_compile, use_sub_dirs, escape_html
通过自定义设置值 charset,可以指定模板文件的编码。(替换静态属性 Smarty::$_CHARSET)
通过自定义设置值 defaultLayout,可以指定默认的继承模板文件。
此设置仅在输出方法中未指定 "extends:" 或 "string:" 等模板资源时才会生效。
Latte
它支持以下设置值。
- tempDirectory, autoRefresh, strictTypes
设置值 baseDir 用于在执行 \Volcanus\TemplateRenderer\Renderer::render() 和 \Volcanus\TemplateRenderer\Renderer::fetch() 时生成 \Latte\Loaders\FileLoader 的构造函数参数 $baseDir。
PHPTAL
它支持以下设置值。
- templateRepository, phpCodeDestination, encoding, phpCodeExtension, outputMode, cacheLifetime, forceReparse
高级使用
可以通过这种方式在替换模板引擎的同时,使用 Renderer::assign() 持续收集输出结果,最后合并并输出。
<?php include './vendor/autoload.php'; use Volcanus\TemplateRenderer\Renderer; use Volcanus\TemplateRenderer\Adapter\SmartyAdapter; use Volcanus\TemplateRenderer\Adapter\LatteAdapter; use Volcanus\TemplateRenderer\Adapter\PhpTalAdapter; // Smarty $renderer = new Renderer(new SmartyAdapter(new \Smarty(), [ 'template_dir' => __DIR__, 'compile_dir' => sys_get_temp_dir(), ])); $renderer->assign('suffix', '様'); file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.tpl', 'Hello {$name}{$suffix} !!'); $renderer->assign('smarty', $renderer->fetch('hello.tpl', ['name' => 'Smarty'])); // Hello Smarty様 !! unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.tpl'); // Latte $renderer->setAdapter(new LatteAdapter(new \Latte\Engine(), [ 'baseDir' => __DIR__, 'tempDirectory' => sys_get_temp_dir(), ])); file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'hello.latte', 'Hello {$name}{$suffix} !!'); $renderer->assign('latte', $renderer->fetch('hello.latte', ['name' => 'Latte'])); // Hello Latte様 !! unlink(__DIR__ . DIRECTORY_SEPARATOR . 'hello.latte'); // PHPTAL $renderer->setAdapter(new PhpTalAdapter(new \PHPTAL(),[ 'templateRepository' => __DIR__, 'phpCodeDestination' => sys_get_temp_dir(), ])); file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . 'outline.tal', <<<'TEMPLATE' <html> <head> <title tal:content="title">タイトル</title> </head> <body> <div tal:content="smarty">Smartyコンテンツ</div> <div tal:content="latte">Latteコンテンツ</div> <div>Hello <span tal:replace="name">Anonymous</span><span tal:replace="suffix">氏</span> !!</div> </body> </html> TEMPLATE ); $renderer->render('outline.tal', [ 'title' => 'PHPTAL + Smarty + Latte', 'name' => 'PHPTAL', ]); unlink(__DIR__ . DIRECTORY_SEPARATOR . 'outline.tal');