jobinja/blade-macro

可重用的作用域保护blade块,运行时无输入输出(@include的替代品,它使用基于PHP原生的include包含)。

2.0.0 2018-06-08 07:39 UTC

This package is not auto-updated.

Last update: 2024-09-23 10:03:17 UTC


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更好的努力的一部分。