Php 无法通过ViewComposer将集合传递给视图
我有一个视图生成器:Php 无法通过ViewComposer将集合传递给视图,php,laravel,laravel-5.2,Php,Laravel,Laravel 5.2,我有一个视图生成器: namespace App\Http\ViewComposers; use Illuminate\Contracts\View\View; use App\Models\FloatingMenu; class FloatingMenuComposer { protected $floatingMenu; public function __construct() { // Dependencies automatically resolv
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use App\Models\FloatingMenu;
class FloatingMenuComposer {
protected $floatingMenu;
public function __construct()
{
// Dependencies automatically resolved by service container...
$this->floatingMenu = FloatingMenu::all();
}
public function compose(View $view)
{
$floatingMenuItems = null;
foreach($this->floatingMenu as $menu){
if ($view->getName() == $menu->page) {
$floatingMenuItems = $menu->floatingMenuItems()->get();
}
}
$view->with('floatingMenuItems' , $floatingMenuItems);
}
}
如果在视图中转储$floatingMenuItems变量,则会得到null。但是,如果我在compose()函数中转储$floatingMenuItems变量,它肯定包含一个数据集合
如果我突然跳出来:
$view->with('floatingMenuItems' , $floatingMenuItems);
与:
然后,当我转储$floatingMenuItems变量时,它在视图中打印出随机字符串。因此,出于某种原因,它不允许我通过视图生成器将集合传递给视图
我该如何解决这个问题?在if语句中更改返回视图的位置。(因为它只执行一次)
更改返回视图在if语句中的位置。(因为它只执行一次) 在我看来:
1.在compose()函数中,$floatingMenuItems变量转储到哪里?内部foreach还是外部foreach?
2.您应该在获取floatingMenuItems后中断foreach设置
试试看 在我看来:
1.在compose()函数中,$floatingMenuItems变量转储到哪里?内部foreach还是外部foreach?
2.您应该在获取floatingMenuItems后中断foreach设置
试试看 不确定该问题,但您可以尝试传递
$floatingMenuItems->toArray()
,并检查它是否在视图中可用。我也有视图生成器,它在我的视图中将模型数据作为一个集合传递,从来没有看到过这个问题。@jaysingkar然后由于“调用null上的array()成员函数”而失败。奇怪的是,如果我在此之前转储变量,它会显示集合。在for each循环中,if()语句执行了多少次?一次或多次?不确定这是否有效,但您可以尝试将null
更改为$floatingMenuItems=collect()
;不确定该问题,但您可以尝试传递$floatingMenuItems->toArray()
,并检查它是否在视图中可用。我也有视图生成器,它在我的视图中将模型数据作为一个集合传递,从来没有看到过这个问题。@jaysingkar然后由于“调用null上的array()成员函数”而失败。奇怪的是,如果我在此之前转储变量,它会显示集合。在for each循环中,if()语句执行了多少次?一次或多次?不确定这是否有效,但您可以尝试将null
更改为$floatingMenuItems=collect()
;这不会有什么不同。实际上,原始代码更干净、更标准。@MinaAbadir我知道这不是一种标准化的方法,但这是存储值的唯一方法。我试图阅读有关PHP变量scope的内容,但在传递到视图时找不到可能导致变量为null的原因。@MinaAbadir我回答了此更改,因为它将在代码中保留变量值。您对变量作用域的关注将得到极大的赞赏。只要它在同一个函数中,作用域就不会成为问题。将视图返回到if中,解决了问题。这对我来说毫无意义,因为范围在这里不应该是一个问题。这不会有什么区别。实际上,原始代码更干净、更标准。@MinaAbadir我知道这不是一种标准化的方法,但这是存储值的唯一方法。我试图阅读有关PHP变量scope的内容,但在传递到视图时找不到可能导致变量为null的原因。@MinaAbadir我回答了此更改,因为它将在代码中保留变量值。您对变量作用域的关注将得到极大的赞赏。只要它在同一个函数中,作用域就不会成为问题。将视图返回到if中,解决了问题。这对我来说毫无意义,因为范围在这里不应该是一个问题。
$view->with('floatingMenuItems' , "Random String");
public function compose(View $view)
{
$floatingMenuItems = collect(); //remove this
foreach($this->floatingMenu as $menu){
if ($view->getName() == $menu->page) {
//$floatingMenuItems = $menu->floatingMenuItems()->get();
$view->with('floatingMenuItems' , $menu->floatingMenuItems()->get());
}
}
}