jobinja / blade-macro
可重用的作用域保护blade块,运行时无输入输出(@include的替代品,它使用基于PHP原生的include包含)。
2.0.0
2018-06-08 07:39 UTC
Requires
- php: ^7.1
- illuminate/contracts: 5.6.* || 5.5.*
- illuminate/support: 5.6.* || 5.5.*
- illuminate/view: 5.6.* || 5.5.*
Requires (Dev)
- illuminate/console: 5.6.* || 5.5.*
- illuminate/view: 5.6.* || 5.5.*
- mockery/mockery: 0.9.*
- phpunit/phpunit: ^4.0 || ^5.0
README
此包引入了一个名为@macro的新blade指令,它允许使用可重用的作用域保护blade代码块。就像@include
所做的那样,但运行时没有输入输出。
@include
使用原生的PHP include
指令,这会导致运行时I/O,即使Opcache完全启用。但有时我们使用@include
仅仅是为了不要重复自己,但这种抽象不应该引起任何性能瓶颈。
安装
对于Laravel >= 5.5.0
composer require jobinja/blade-macro
对于Laravel <= 5.3.0
composer require jobinja/blade-macro:1.0.*
用法
只需在您的app.php
中使用以下服务提供者:
[ \JobinjaTeam\BladeMacro\JobinjaBladeMacroServiceProvider::class, //... ]
然后您可以简单地替换需要的旧的@include
指令为新的@macro
指令。
@include('some_partial', ['some_var' => 'some_value') // Should be replaced with: @macro('some_partial', ['some_var' => 'some_value'])
配置
默认情况下,该包在开发环境中在每个请求时重新编译blade视图,如果您想禁用此功能,请运行:
php artisan vendor:publish --provider=JobinjaTeam\BladeMacro\JobinjaBladeMacroServiceProvider
并根据您的需求配置包。
问题
请参阅#16583或简单地阅读以下内容:
考虑以下循环
@for($i=1; $i < 500000; $i++) @include('iteration_presenter', ['iteration' => $i]) @endfor
上面的代码将被替换为类似以下的内容
<?php for($i=1; $i < 5000000; $i++){ ?> <?php // Just for example in real world laravel wraps this // around a method to satisfy scope protected data. include './blade_compiled_path/iteration_presenter.php'; ?> <?php } ?>
上面的代码包含了iteration_presenter.blade.php
文件5000万次,这导致了大量的I/O调用,但我们使用iteration_presenter
部分的原因只是为了创建更多的抽象,避免重复。
解决方案
我们不是使用原生的include
指令,而是创建了一个新的@macro
指令,它简单地复制/粘贴部分内容在编译时,因此没有I/O。
@for($i=1; $i < 500000; $i++) @macro('iteration_presenter', ['iteration' => $i]) @endfor
上面的@macro
指令将被翻译为以下内容
<?php for($i=1; $i < 5000000; $i++){ ?> <?php (function ($scopeData) { extract($scopeData); ?> <?php echo e($iteration);?> <?php })($someHowComputedScope) ;?> <?php } ?>
运行测试
composer test
许可证
在MIT许可下发布,是使Jobinja.ir更好的努力的一部分。