crazyfd / php-blade
Standalone Laravel Blade templating for PHP applications. Webman blade view handler out of the box (php webman blade:cache / blade:clear).
Requires
- php: >=8.1
- illuminate/view: ^10.0 || ^11.0 || ^12.0 || ^13.0
Requires (Dev)
- phpunit/phpunit: ^10.5 || ^11.0
- symfony/console: ^5.4 || ^6.0 || ^7.0 || ^8.0
- workerman/webman-framework: ^2.0
Suggests
- webman/console: To register blade:cache and blade:clear in Webman.
- workerman/webman-framework: For the Webman view handler.
README
Laravel Blade 模板引擎的独立 PHP 版本(webman blade),可用于 Webman 等非 Laravel 环境:安装即得 Blade 视图渲染、blade:cache / blade:clear 命令。基于 jenssegers/blade / webman/blade 升级维护,感谢原作者。
支持 illuminate/view 10.x / 11.x / 12.x / 13.x。
背景
我们的业务迭代很快,之前技术栈是 Laravel + Octane。但由于业务场景比较特殊、流量较大,服务经常遇到性能瓶颈和稳定性问题,在现有硬件资源无法进一步扩容的情况下,我们经过多方面评估,最终将 Laravel 迁移到了 Webman。
迁移之后,Webman 在高并发和高性能场景下的表现确实非常优秀,也很好地解决了我们之前遇到的一些问题。
但在实际迁移过程中,我们也发现了一个比较明显的问题:Laravel 生态经过多年的发展,已经形成了一套非常完善、成熟的组件体系,而 Webman 生态中的部分通用组件存在维护不及时、版本兼容性不足,以及与新版 illuminate/* 组件适配不完善等情况。
与此同时,我们并不希望因为从 Laravel 迁移到 Webman,就放弃 Laravel 中成熟的开发习惯和生态能力。更重要的是,我们希望 Laravel → Webman 的迁移能够尽可能平滑,让原有项目的代码、业务逻辑和成熟组件得到最大程度的复用,而不是为了适配 Webman 而进行大量重构和重复开发。
因此,我们决定围绕现代 Laravel / Illuminate 生态进行适配和维护,在保持 Laravel 原有使用方式和开发体验的基础上,让这些组件能够更好地运行在 Webman 环境中。通过这种方式,尽可能降低 Laravel 项目迁移到 Webman 的改造成本,让原有代码少改甚至不改即可继续使用。
不仅仅是解决当前项目的兼容性问题,更是逐步补齐 Webman 生态中缺失的通用组件,并长期维护一批高质量、现代化的 PHP 组件包,同时将 Webman 作为官方支持的一等集成场景。
简单来说,我们希望做到:
享受 Webman 的高性能,同时保留 Laravel 成熟的生态、开发体验和代码资产,让 Laravel → Webman 不再意味着大规模重写。
环境要求
- PHP >= 8.1
- illuminate/view ^10.0 || ^11.0 || ^12.0 || ^13.0
注意:实际 PHP 最低版本还取决于安装的 illuminate major 版本;例如 illuminate/view 13.x 要求 PHP >= 8.3。
Webman 集成需要:
- workerman/webman-framework ^2.0
- webman/console ^2.0(使用
blade:cache/blade:clear命令时)
安装
composer require crazyfd/php-blade
使用
全局 helper(Laravel 风格)
独立环境(非 webman)下提供 view() / blade() 全局函数,写法与 Laravel 一致:
echo view('homepage', ['name' => 'John Doe'])->render(); // 或直接输出(View 实现了 __toString) echo view('homepage', ['name' => 'John Doe']);
首次调用 blade($viewPath, $cachePath) 可指定视图/缓存目录(默认 <cwd>/views 与系统临时目录),之后全局共享同一实例:
blade(__DIR__ . '/views', __DIR__ . '/cache'); // 初始化(可选) echo view('homepage', ['name' => 'John Doe']);
在 webman 中,框架自带的
view()(返回Response)优先生效,本包不会覆盖;请按下节方式使用。
框架集成
目前阶段官方集成以 Webman 为主,Webman 用户开箱即用;其他框架暂无官方集成包,可直接实例化核心类使用。
Webman
安装后自动生成 config/plugin/crazyfd/blade/app.php,可配置视图缓存目录等编译选项:
<?php return [ 'enable' => true, // 编译后的视图缓存目录 'cache_path' => runtime_path() . '/views', // 是否缓存编译结果(false 时每次重新编译,仅建议开发环境使用) 'cache' => true, // 编译文件扩展名 'compiled_extension' => 'php', // 检查缓存时间戳,模板更新后自动重新编译 'check_timestamps' => true, ];
配置 config/view.php 使用本包的 handler(替代 support\view\Blade,读取上述配置):
use Jenssegers\Blade\Webman\View as BladeView; return [ 'handler' => BladeView::class, ];
控制器中按 Webman 约定渲染,模板放在 app/view/ 下:
return view('user/profile', ['name' => 'John Doe']);
视图名
/与.分隔符均可:user/profile(Webman 惯例)与user.profile(Laravel 惯例)解析到同一个模板,从 Laravel 迁移的代码无需修改。
自定义指令 / 条件通过 config/view.php 的 extension 回调注册(blade:cache 预编译时同样生效):
use Jenssegers\Blade\Blade; return [ 'handler' => \Jenssegers\Blade\Webman\View::class, 'extension' => function (Blade $blade): void { $blade->directive('shout', fn ($expression) => "<?= strtoupper((string) ($expression)) ?>"); }, ];
命令行管理编译缓存:
php webman blade:cache # 预编译所有 Blade 模板(上线前执行可提升首次访问速度) php webman blade:clear # 清空编译缓存
直接实例化
use Jenssegers\Blade\Blade; $blade = new Blade('/path/to/views', '/path/to/cache'); echo $blade->render('homepage', ['name' => 'John Doe']);
常用 API
$blade->make('view.name', $data)->render(); // 渲染视图 $blade->render('view.name', $data); // 等价快捷方式 $blade->exists('view.name'); // 视图是否存在 $blade->share('key', $value); // 共享数据 $blade->compiler(); // BladeCompiler 实例 $blade->directive('name', $handler); // 自定义指令 $blade->if('admin', $callback); // 自定义条件 $blade->component(Alert::class, 'alert'); // 注册组件 $blade->addNamespace('namespace', $path); // 命名空间视图
Blade 模板
模板语法与 Laravel 完全一致(@if / @foreach / @include / {{ }} 转义 / {!! !!} 原样输出 / 组件 / 插件指令等),详见 Laravel Blade 文档。
注意:指令的 @ 前不能紧跟字母(yes@else 不会编译,需写成 yes @else 或换行),这是 Blade 编译器原生行为。
架构分层
Jenssegers\Blade\Blade是核心渲染入口,可在普通 PHP 项目中独立使用Jenssegers\Blade\Webman\View是 Webman view handler,只负责读取 Webman 配置和适配 Webman 渲染约定Jenssegers\Blade\Webman\Command\*只负责 Webman 下的模板缓存命令src/config/plugin/crazyfd/blade只用于 Webman 插件配置发布
兼容矩阵
| Package Version | PHP | Framework Integration | illuminate/view | Status |
|---|---|---|---|---|
| 2.x | >=8.1; 13.x requires >=8.3 | Webman ^2.0 | 10.x - 13.x | Maintained |
与官方 webman/blade 的差异
- 支持 illuminate/view 13.x(官方尚未发布支持)
- 修复
ViewServiceProvider中DynamicComponent未导入导致 dynamic-component 注册到不存在类的 bug - BladeCompiler 构造参数与 Laravel 13 对齐(支持
view.cache/view.compiled_extension/view.check_cache_timestamps配置) - PHP 8.1+ 原生类型声明
- 完整测试覆盖(渲染、指令、组件、Webman 集成层、跨 illuminate 版本矩阵)
运行测试
composer install
composer test
License
MIT