php – 如何在laravel刀片中进行一次性推送

前端之家收集整理的这篇文章主要介绍了php – 如何在laravel刀片中进行一次性推送前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用类似于以下(widget.blade.PHP)的Laravel刀片创建 HTML小部件:
@push('scripts')
   <script src="{{ asset('js/foo.js') }}"></script>
   <script>
   ...
   </script>
@endpush
@push('styles')
   <link href="{{ asset('css/bar.css') }}" rel="stylesheet">
@endpush
<div>
... HTML contents
</div>

我在其他刀片中使用小部件,如:

<div>
  ... 
  @include('widget')
</div>
<div>
  ... 
  @include('widget')
</div>

问题是当我在页面中多次使用窗口小部件时,“脚本”和“样式”重复多次.

如何防止Laravel多次推送“脚本”和“样式”?

在下面的回答中,我假设您熟悉 Blade extension.此方法已在Laravel 5.2和5.3上进行了测试(请参阅下面的注释).

在测试Ismail RBOUH’s Answer(所以请阅读它)之后,解决方案似乎有两个问题:

1- $isDisplayed变量与其他包含的小部件不在同一范围内,因此每个@include将其脚本推送到堆栈.结果我将其更改为:

Blade::directive('pushonce',function ($expression) {
    $isDisplayed = '__pushonce_'.trim(substr($expression,2,-2));
    return "<?PHP if(!isset(\$__env->{$isDisplayed})): \$__env->{$isDisplayed} = true; \$__env->startPush{$expression}; ?>";
});
Blade::directive('endpushonce',function ($expression) {
    return '<?PHP $__env->stopPush(); endif; ?>';
});

2-解决方案将@pushonce的使用限制为一个小部件.即,在2个或更多小部件(widget1.blade.PHP,widget2.blade.PHP,…)的情况下,它阻止推送其他小部件脚本.所以,我使用以下代码将域添加到@pushonce:

Blade::directive('pushonce',function ($expression) {
    $domain = explode(':',trim(substr($expression,-2)));
    $push_name = $domain[0];
    $push_sub = $domain[1];
    $isDisplayed = '__pushonce_'.$push_name.'_'.$push_sub;
    return "<?PHP if(!isset(\$__env->{$isDisplayed})): \$__env->{$isDisplayed} = true; \$__env->startPush('{$push_name}'); ?>";
});
Blade::directive('endpushonce',function ($expression) {
    return '<?PHP $__env->stopPush(); endif; ?>';
});

用法

widget1.blade.PHP

@pushonce('scripts:widget1')
   <script src="{{ asset('js/foo.js') }}"></script>
   <script>
   ...
   </script>
@endpushonce

widget2.blade.PHP

@pushonce('scripts:widget2')
   <script src="{{ asset('js/bar.js') }}"></script>
   <script>
   ...
   </script>
@endpushonce

L 5.3的注意事项:
更改以下行:

$domain = explode(':',-2)));

$domain = explode(':',1,-1)));

猜你在找的Laravel相关文章