【问题标题】:How to pass variables by reference to @include in a blade template?如何通过引用刀片模板中的@include 来传递变量?
【发布时间】:2014-10-15 18:31:37
【问题描述】:

在 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 或其他一些丑陋的替代品(Session 变量应该在调用 include 范围时保持它们的值,但这只是一种令人讨厌和脆弱的方法)?

【问题讨论】:

    标签: php laravel-4 blade


    【解决方案1】:

    使用,

    @include('view', array('key'=>'value')) 
    

    这将是最好的方法。

    【讨论】:

    • 就像我在问题“将值作为数组传递给 @include 显然是按值传递并产生相同的效果”。虽然我认为这可能在我之前尝试它时可能工作得太早了,但当我今天尝试它时它仍然是按价值传递的(这可能从它的调用方式中很明显)。这个答案很简短 - 也许您的解决方案中有一些关键细节您忽略了分享,以便通过参考传递?
    【解决方案2】:

    我从你所说的中得到它,你一直在做这样的事情。

    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';
    

    【讨论】:

    • 我已经完全按照您对上面简单示例的建议进行了尝试,但问题仍然存在 - 我在文件中声明了变量并在之后立即执行 View::share。然后我将该文件的要求添加到全局开始并删除布局中的所有直接分配,以便唯一的分配将是包含刀片中的预增量。 tabindex 在每个包含的开头仍然回到它的初始值。我在此过程中遗漏了什么吗?
    【解决方案3】:

    Laravel 刀片包含似乎为您添加的每个包含的模板创建一个变量范围。

    View:share('name', $value)
    

    做与你想要的不同的事情,它旨在为每个渲染的模板注入一些任意变量,在引导程序或控制器的入口点定义资产路径很有用。

    要解决您的问题,只需告诉包含范围内的 php 通过global 查找上面的变量,因此main.blade.php

    <?php $tabIndex = 0 ?>
    @include('subform');
    

    在模板中subform.blade.php

    <?php 
        global $tabindex;
        $tabindex++;
    ?>
    

    注意,如果您不在主模板中定义变量,这可能不起作用,我只在主模板(我在控制器中呈现的模板)尝试过这个并且它有效。

    【讨论】:

    • 这对我有用,但前提是我在主模板中添加以下代码:
    猜你喜欢
    • 2021-03-09
    • 1970-01-01
    • 2015-07-10
    • 2019-08-05
    • 2018-09-16
    • 2020-05-20
    • 2019-06-05
    • 2022-01-01
    • 2013-11-04
    相关资源
    最近更新 更多