simsoft/twig
Composer 安装命令:
composer require simsoft/twig
包简介
A lightweight Twig wrapper that simplifies template engine setup with configuration-driven initialization, namespace support, and easy extension authoring.
README 文档
README
A lightweight PHP wrapper for the Twig 3.x template engine. Simplifies setup with configuration-driven initialization, namespace support, and easy extension authoring.
Features
- Configuration-based initialization (paths, caching, debug, charset, timezone)
- Built-in HTML minification for production output
- Template namespaces for organized directory structures
- Simplified extension base class with helper methods for filters, functions, and tests
- Fluent API for runtime customization
- Auto-escaping enabled by default (XSS protection)
Requirements
- PHP 8.2+
- Composer
Installation
composer require simsoft/twig
Quick Start
use Simsoft\Twig\Twig; $twig = new Twig([ 'path' => __DIR__ . '/templates', 'cache' => __DIR__ . '/cache', ]); // Render to string $html = $twig->render('hello', ['name' => 'World']); // Output directly $twig->display('hello', ['name' => 'World']);
Configuration Options
| Option | Type | Default | Description |
|---|---|---|---|
path |
string|string[] | / |
Path(s) to templates directory |
fileExtension |
string | .twig |
Template file extension |
debug |
bool | false |
Enable debug mode |
charset |
string | UTF-8 |
Template charset |
cache |
string | — | Compiled template cache directory |
timezone |
string | — | Timezone for date formatting |
extensions |
array | [] |
Array of ExtensionInterface instances |
namespaces |
array | [] |
Map of namespace name → template path |
minify |
bool | false |
Minify HTML output (removes comments, collapses whitespace) |
Unrecognized config keys will throw an InvalidArgumentException to catch typos
early.
Typed Configuration (Alternative)
For IDE autocompletion, use the TwigConfig object instead of an array:
use Simsoft\Twig\Twig; use Simsoft\Twig\TwigConfig; $twig = new Twig(new TwigConfig( path: __DIR__ . '/templates', cache: __DIR__ . '/cache', debug: true, timezone: 'Asia/Kuala_Lumpur', minify: true, extensions: [new \App\MyExtension()], namespaces: [ 'layouts' => __DIR__ . '/templates/layouts', ], ));
Full Configuration Example
use Simsoft\Twig\Twig; $twig = new Twig([ 'path' => __DIR__ . '/templates', 'fileExtension' => '.twig', 'debug' => true, 'charset' => 'UTF-8', 'cache' => __DIR__ . '/cache', 'timezone' => 'Asia/Kuala_Lumpur', 'minify' => true, 'extensions' => [new \App\MyExtension()], 'namespaces' => [ 'layouts' => __DIR__ . '/templates/layouts', 'components' => __DIR__ . '/templates/components', 'macros' => __DIR__ . '/templates/macros', ], ]);
Template Namespaces
Namespaces let you reference templates from different directories:
// Renders @layouts/base.twig $twig->render('@layouts/base', ['title' => 'Home']);
HTML Minification
Enable minify to automatically strip HTML comments, collapse whitespace
between tags, and reduce output size across all rendering methods (render(),
display(), renderBlock(), renderIf()):
$twig = new Twig([ 'path' => __DIR__ . '/templates', 'minify' => true, // All output is minified ]); // This output will be minified automatically $html = $twig->render('page', ['title' => 'Home']);
The static helper Twig::minify() is also available for one-off use on any HTML
string:
$minified = Twig::minify($rawHtml);
Minification preserves IE conditional comments (<!--[if IE]>) and does not
alter content inside <pre>, <code>, or <script> inline text (only
whitespace between tags is collapsed).
Runtime API
// Share global variables $twig->share('site_name', 'My Site'); $twig->share(['app' => 'MyApp', 'version' => '1.0']); // Add filters $twig->addFilter('slug', fn (string $s) => strtolower(str_replace(' ', '-', $s))); // Add functions $twig->addFunction('asset', fn (string $path) => "/assets/{$path}"); // Add tests $twig->addTest('even', fn (int $n) => $n % 2 === 0); // Check if a template exists if ($twig->exists('email/welcome')) { $twig->display('email/welcome', $data); } // Render only if template exists (returns empty string otherwise) $sidebar = $twig->renderIf('partials/sidebar', ['items' => $menuItems]); // Render a specific block $header = $twig->renderBlock('page', 'header', ['title' => 'Welcome']); // Access underlying Twig Environment $env = $twig->getInstance();
Building Extensions
Extend Simsoft\Twig\Extension and register filters, functions, and tests in
the init() method:
<?php declare(strict_types=1); namespace App; use Simsoft\Twig\Extension; class MyExtension extends Extension { public function getGlobals(): array { return [ 'app_name' => 'My Application', ]; } protected function init(): void { $this->addFilter('obj_to_array', fn (object $obj) => (array) $obj); $this->addFunction('dump', fn (...$args) => call_user_func_array('var_dump', $args)); $this->addTest('red', function ($value) { return ($value->color ?? $value->paint ?? null) === 'red'; }); } }
For advanced extension features, see Extending Twig.
Template Authoring
See Twig for Template Designers for template syntax reference.
Why Simsoft Twig?
| simsoft/twig | slim/twig-view | rcrowe/twigbridge | twig/twig (raw) | |
|---|---|---|---|---|
| Purpose | Framework-agnostic wrapper | Slim 4 integration | Laravel integration | Core engine |
| Framework coupling | None | Slim (PSR-7/15) | Laravel | None |
| Setup | Single constructor call | DI container + middleware | ServiceProvider + config | Manual loader + environment |
| Config | Array or typed DTO | Constructor params | Laravel config file | Manual PHP code |
| Extension authoring | Base class with init() |
Use raw Twig | Laravel-specific helpers | Extend AbstractExtension |
| Namespace support | Built-in via config | Manual | Via config | Manual addPath() |
| Convenience methods | exists(), renderIf(), share(), minify |
No | No | getLoader()->exists() only |
| Config validation | Throws on typos | No | No | No |
| Static analysis | PHPStan level 8 | Level 5 | None | Level 5 |
Use simsoft/twig when you want Twig in any PHP project (custom frameworks, legacy apps, microservices, CLI tools) without framework lock-in or manual wiring.
Use something else when you're already in Laravel (rcrowe/twigbridge) or
Slim (slim/twig-view), or need custom loaders like database/S3 (use
twig/twig directly).
License
MIT — see LICENSE for details.
simsoft/twig 适用场景与选型建议
simsoft/twig 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 84 次下载、GitHub Stars 达 0, 最近一次更新时间为 2024 年 04 月 04 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「templating」 「php」 「twig」 「template」 「view」 「render」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 simsoft/twig 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 simsoft/twig 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 simsoft/twig 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Shoot aims to make providing data to your templates more manageable
This Symfony bundle integrates PhpSpreadsheet into Symfony using Twig.
A Twig extension to insert css as inline styles with a tag
Caching and compression for Twig assets (JavaScript and CSS).
Twig extensions for Tracy Debugger
A Processor for Markup written in PHP. Allows extraction of Markup into a data structure, orchestrated nested manipulation of said structure, and output as (optimized) Markup.
统计信息
- 总下载量: 84
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 12
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2024-04-04