在Laravel 4.2设置中,我在模板中有一个变量,我希望在多个包含中共享:
master.blade
<?php $tabindex = 0; ?>{{--This is the variable--}}
@include('header'){{-- <-in header.blade, I often use ++$tabindex --}}
{{--$tabindex is still 0--}}
@include('content'){{-- <-in content.blade, I often use ++$tabindex --}}
{{--$tabindex is still 0--}}
@include('footer'){{-- <-in footer.blade, I often use ++$tabindex --}}
{{--$tabindex is still 0--}}
$tabindex
如果用作tabindex html属性显然是一个简单的例子,我可以使用安全值和足够大的缓冲区值来解决这个问题,但这不是优雅的,也不是解决实际问题的方法。在regular php includes中,我理解包含文件中的变量赋值会影响包含文件中的变量 - 这是期望的效果。
我尝试了View::share()
,但它出现了相同的症状。将值作为数组传递给@include
显然是通过值传递并产生相同的效果。
似乎首先完整地评估包含范围值,然后是包含的范围。如果是这种情况,如果在包含范围中有任何用法或者进一步包含范围(甚至通过某些持久存储器存储),那么它将使我正在尝试做的更不可行,因为执行的顺序会有所不同而不是代码中的顺序。
是否存在一些未记录的刀片巫术,以防止刀片@include
切断其改变其包含者变量的值,或者我必须依靠直接的php include
或其他一些丑陋的替代品({ {1}}变量应该在调用include范围内保持它们的值,但这只是一个讨厌和脆弱的方法吗?
答案 0 :(得分:6)
使用,
@include('view', array('key'=>'value'))
将是最好的方式。
答案 1 :(得分:0)
我从你所说的那里得到它,你一直在做这样的事情。
View::share('some_variable',$some_variable);
也许在模板中初始化变量。不鼓励这种做法,但还有另一种方法可以做到这一点,即在php文件中初始化变量并通过将此行添加到文件中来共享它。
$some_variable = 0; //Initialize it any way you need to.
View::share('some_variable', $some_variable);
然后在你的app / start / global.php中添加这一行。
require app_path().'/composers.php';
答案 2 :(得分:0)
Laravel刀片似乎为您添加的每个包含的模板创建了一个可变范围。
View:share('name', $value)
与您想要的不同,它旨在为每个呈现的模板注入一些任意变量,它可用于在控制器的引导程序或入口点定义资产路径。
要解决您的问题,只需告诉包含范围内的php,通过global
查找上面的变量,main.blade.php
:
<?php $tabIndex = 0 ?>
@include('subform');
并在模板subform.blade.php
<?php
global $tabindex;
$tabindex++;
?>
注意,如果您不在主模板中定义变量,这可能不起作用,我只在主模板(我在控制器中渲染到的模板)中尝试了这个并且它有效。