gpt4 book ai didi

php - 如何在 laravel blade 中一次性推送

转载 作者:可可西里 更新时间:2023-10-31 23:06:42 24 4
gpt4 key购买 nike

我正在尝试使用 Laravel Blade 创建一个 HTML 小部件,类似于以下内容 (widget.blade.php):

@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>

我在另一个 Blade 中使用小部件,例如:

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

问题是当我在一个页面中多次使用小部件时,“脚本”和“样式”会重复多次。

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

最佳答案

从 Laravel 7.25 开始,Blade 现在包含一个新的 @once 组件,它只会渲染标签中的项目一次。 https://laravel.com/docs/8.x/blade#the-once-directive

在下面的回答中,我假设您熟悉 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, -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(':', trim(substr($expression, 2, -2)));

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

关于php - 如何在 laravel blade 中一次性推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38135455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com