nickyx3 / blitz
Laravel Blitz 视图(由 Alexey Rybak 开发的 Blitz 扩展模板引擎,https://github.com/alexeyrybak/blitz)
Requires
- php: >=8.0
README
Blitz 模板 PHP 扩展的 Facade。
要求
-
Blitz 扩展(https://github.com/alexeyrybak/blitz)
-
如果您想使用 Redis 缓存编译的模板,可能需要 https://github.com/phpredis/phpredis 扩展或 https://github.com/predis/predis 类 Redis 缓存类型,使用 Laravel Redis Facade,配置在您的 redis 配置中。
默认缓存类型是 "file",准备好的模板存储在 laravel "storage/blitz_compiled" 文件夹中(可能在配置中更改)。默认情况下,缓存是禁用的,您可以在 "config/blitz.php" 中将 "cache_enabled" 更改为 "true"。
Laravel 安装
使用 Composer 需求此包
$ composer require nickyx3/blitz
然后运行
$ php artisan vendor:publish --provider="NickyX3\Blitz\Providers\BlitzServiceProvider"
配置
默认配置
'templates_folder' => 'blitz_view', 'cache_type' => 'file', 'cache_enabled' => false, 'compiled_folder' => 'blitz_compiled', 'scope_lookup_limit' => 8, 'php_callbacks_first' => 1, 'namespace_finder' => [ 'App\Helpers', 'Illuminate\Support', 'Illuminate\Support\Facades' ]
配置参数
- templates_folder - 源模板相对于 laravel 资源文件夹的位置
- cache_type - 'file' 或 'redis',默认 'file'
- cache_enabled - 启用或禁用缓存,默认 'false'
- compiled_folder - 缓存存储相对于 laravel 存储文件夹的位置,如果缓存类型为 'redis',则 redis 键是文件系统中编译文件的完整路径,例如 'file' 缓存类型
- scope_lookup_limit - Blitz 扩展 ini 参数
- php_callbacks_first - Blitz 扩展 ini 参数
- namespace_finder - 模板处理器将在哪个命名空间中查找模板中指定的回调类。例如,您在模板中写了
Lang::get('DefaultTitle')
。处理器将在这这些命名空间中查找第一个匹配的类,并将其扩展为具有命名空间的完全限定类名(Illuminate\Support\Facades\Lang::get('DefaultTitle')
)。如果找不到类,则删除回调。
使用方法
示例控制器
use NickyX3\Blitz\Facade\BlitzView; Route::get('/', function () { return BlitzView::apply('example.blitz-extend',['title'=>'Blitz Title']); });
方法 apply
返回 Illuminate\Http\Response
,方法 make
是 apply
的别名
命令
此命令还可用以清除模板缓存
$ php artisan blitz:clear
异常
如果 Blitz 生成错误,则抛出自定义的 BlitzException 并使用集成渲染器。如果您的 env APP_DEBUG=true
,则将渲染此异常,否则使用 abort 辅助程序显示简单的 Laravel 错误 500。
模板语法功能
与只能做包含的 Blitz 不同,模板 "up" 继承的工作方式类似于 Blade 引擎。以下 Blade 指令被支持:@yield
、@extends
、@section
和 @endsection
放在 HTML 注释标签中。还添加了对 Blade @csrf
辅助程序的支持,在 HTML 注释标签中如 <!-- @csrf -->
或直接 @csrf
示例
- "example/master.tpl" 模板
<!DOCTYPE html> <html lang="en"> <body> <!-- @yield('content') --> </body> </html>
- "blitz-extend.tpl" 模板
<!-- @extends('example.master') --> <!-- @section('content') --> <div class="child-template">this is template extends example/master.tpl</div> <!-- @endsection -->
回调是如何工作的?
- 一些 Blitz 指令,如带有回调的行内条件,将转换为完整版本,因为回调在条件中不起作用
{{ if($title,$title,Lang::get('DefaultTitle')) }}
转换为
{{ IF $title }}{{ $title }}{{ ELSE }}{{ Illuminate\Support\Facades\Lang::get('DefaultTitle') }}{{ END if-title }}
- 带有回调的完整 Blitz IF 条件,如下所示
{{ IF App::currentLocale()=='en' }} currentLocale: {{ App::currentLocale() }} {{ ELSE }} currentLocale not 'en' {{ END }}
将在缓存模板中转换为以下代码
{{ IF Illuminate\Support\Facades\App::currentLocale()=='en' }} currentLocale: {{ Illuminate\Support\Facades\App::currentLocale() }} {{ ELSE }} currentLocale not 'en' {{ END }}
但获取 "compiled" 模板后,所有这样的回调将实时转换为变量
{{ IF $callback_83e69f8a22cc276d050d93f63c89a290=='en' }} currentLocale: {{ $callback_83e69f8a22cc276d050d93f63c89a290 }} {{ ELSE }} currentLocale not 'en' {{ END }}
变量 $callback_83e69f8a22cc276d050d93f63c89a290
将被设置为 eval Illuminate\Support\Facades\App::currentLocale();
的结果。如果模板中有与条件匹配的回调函数,它们也将被替换为这个变量,以避免多次调用回调函数。
祝您玩得开心!
代码可能不是很优秀,我刚开始接触 Laravel,而且文档也很不完整,因为我要去度假了。也许我以后会详细注释一下 :-)
欢迎提出补充和更正。