【问题标题】:Laravel passing variable out of view partial to main blade, or between partialsLaravel 将变量传递到部分主刀片或部分之间的视图之外
【发布时间】:2018-08-16 09:16:48
【问题描述】:

我有一个 Laravel 5.5 应用程序,它通常使用视图刀片,没什么特别的。我的刀片是一个很长的数据表,我将组部分(项目类别)拆分为它们自己的部分,以更好地管理代码。

但是,我找不到将可变数据从局部刀片传递回主刀片甚至在局部刀片之间传递的方法。变量的范围被限制在部分中,我需要显示一个页面总数,该页面汇总了来自各个部分(部分)的小计。我确实尝试过使用

View::share('portfolio_total', 100);

在 AppServiceProvider 中,无济于事。我可以设置一个在主刀片中保持不变的值(如所示的 100),但不会在部分中获取该变量中设置的值。更改部分内的变量值不会更新主刀片可用的值。我已经对此进行了广泛的搜索,并且有很多将值传递给部分的示例,但没有退出。

是否有一个 Laravel 技巧来定义等效的全局变量,这些变量可以在包含的部分刀片中设置它们的值,并将该值传递到另一个部分刀片,或传出到主刀片?

提前致谢。

【问题讨论】:

  • 您不应该将变量传递给局部变量,将它们传递给局部变量的父级,其中您包含局部而不是主刀片文件

标签: php laravel variables laravel-5 laravel-blade


【解决方案1】:

我找不到将可变数据从分部传回主刀片的方法,甚至在分部之间也找不到。

那是因为这绝对是不好的做法。因此框架不允许这样做(没有滥用)。

为什么?

在 MVC 世界(Laravel 实现)中,视图负责显示数据。

如果您在视图中计算任何内容(部分或不),那么这意味着您将控制器和/或模型的责任交给视图。这当然不好。

然后呢?

想法是在使用视图之前计算您需要的所有内容。两种选择:

  • 如果您的视图/局部视图仅由单个控制器方法使用,只需像往常一样将数据传递给视图。
  • 如果您的视图/部分在不同的地方使用,请设置一个 ViewComposer,它能够在每次使用该部分时传递计算数据。

【讨论】:

  • 谢谢文森特,你当然是对的,这就是我现在为解决我的问题所做的。工作正常。现在我在我的控制器中计算这些总数并将结果堆栈中的值传递给刀片。我只是希望当我在刀片 @foreach 循环中增加总计时,我可以简单地添加这些变量以显示我的总体总计。由于 Laravel 在视图/刀片中提供了如此多的灵活性,因此只需添加变量就显得如此接近和快速。如果我没有使用局部,这将是成功的。再次感谢您的帮助。
  • 我不同意这是“不好的做法”,因为它“不是 MVC”。相反,这是不好的做法,因为如果子级刀片要引入或更改外部刀片中的变量值,则极有可能导致错误。
【解决方案2】:

我通常做的事情如下。

在我的控制器上,要返回数据我这样做:

    $data = [];
    $data['dummyData'] = Dummy::all();
    $data['extraData'] = 'Extra string';
    return view('myroute.index', array('data' => $data));

然后是我的每个观点(观点和部分)

@php
  $dummy = $data['dummyData'];
  $extra = $data['extraData'];
@endphp

然后我可以像使用其他任何变量一样使用刀片中的变量:{{ $extra }}

【讨论】:

  • 谢谢雅各布。我添加到我的控制器:` $data = []; $data['monetary_joint_total'] = 0; $data['personal_joint_total'] = 0; $data['sum_real_assets'] = 0; $data['portfolio_total'] = 0; return view('myHostView',array('data' => $data) );` 以及每个部分和“主机”刀片:@php $monetary_joint_total = $data['monetary_joint_total']; $personal_joint_total = $data['personal_joint_total']; $sum_real_assets = $data['sum_real_assets']; $portfolio_total = $data['portfolio_total']; @endphp 但仍然没有{{dd($monetary_joint_total)}}
  • 能否请您在评论中发布您用来调用部分代码的代码?
猜你喜欢
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 2017-09-02
  • 2016-12-29
  • 2014-09-15
  • 2016-11-20
  • 1970-01-01
  • 2015-06-10
相关资源
最近更新 更多