Laravel 5.1子视图间传递动态计数器值的问题
解决Laravel 5.1中子视图共享递增计数器的问题
嘿,我来帮你搞定这个计数器的问题!你现在遇到的情况是每个子视图都把计数器重置为0,这其实是因为PHP的变量传递机制和Blade视图的作用域导致的——你原来传递的是普通整数,每个子视图拿到的都是父视图变量的副本,修改副本不会影响父视图里的原始值,所以下一个子视图还是拿到初始的0。
下面给你两种靠谱的解决方案,都是让计数器在子视图间共享更新后的值:
方案一:使用对象传递计数器(推荐)
对象在PHP里是引用传递的,所有子视图操作的都是同一个对象实例,修改它的属性会直接反映到所有引用的地方。
1. 修改视图编写器
把原来的整数计数器换成一个包含计数属性的对象:
class PDFComposer { public function compose(View $view) { // 创建一个标准对象来存计数器 $counter = new \stdClass(); $counter->pdfCount = 0; $view->with('counter', $counter); } }
2. 主视图传递对象给子视图
在summary视图里,把这个counter对象传给每个answer子视图:
@include('answer', ['answers' => $group0, 'counter' => $counter]) @include('answer', ['answers' => $group1, 'counter' => $counter]) @include('answer', ['answers' => $group2, 'counter' => $counter]) @include('answer', ['answers' => $group3, 'counter' => $counter])
3. 子视图中更新计数器
在answer子视图里,直接修改对象的属性就行,这样后续子视图拿到的就是更新后的值:
@foreach($answers as $answer) @if(/* 你判断计数的条件 */) {{ $counter->pdfCount++ }} <!-- 或者只执行递增不输出:@php $counter->pdfCount++; @endphp --> @endif @endforeach
方案二:使用引用传递整数(不推荐但可行)
如果你不想用对象,也可以通过PHP的引用传递来实现,但这种方式在Blade里要注意语法,而且容易踩坑:
1. 视图编写器保持初始值
视图编写器还是传整数,但主视图里要把它作为引用传给子视图:
class PDFComposer { public function compose(View $view) { $view->with('pdfCount', 0); } }
2. 主视图用引用传递
在summary视图里,用&符号把计数器作为引用传给子视图:
@include('answer', ['answers' => $group0, 'pdfCount' => &$pdfCount]) @include('answer', ['answers' => $group1, 'pdfCount' => &$pdfCount]) @include('answer', ['answers' => $group2, 'pdfCount' => &$pdfCount]) @include('answer', ['answers' => $group3, 'pdfCount' => &$pdfCount])
3. 子视图中更新引用变量
在answer子视图里直接修改这个引用变量:
@foreach($answers as $answer) @if(/* 你的条件 */) {{ $pdfCount++ }} @endif @endforeach
为什么原来的方式不行?
原来的实现中,每个@include都会把父视图的pdfCount值复制一份给子视图,子视图里的$pdfCount++只是修改了这个局部副本,父视图里的原始值还是0,所以下一个子视图拿到的依然是初始的0。而对象是引用类型,所有子视图操作的都是同一个实例,修改会全局生效。
内容的提问来源于stack exchange,提问作者Jampire
相关产品推荐
相关产品推荐

