Laravel 5.3 View Composer -改变从控制器到视图传递的数据


Laravel 5.3 View Composer - Changing data passed from controller to view

我对如何在Laravel中工作视图作曲家有点困惑,我想我可能会问一些建议。

例如,我的网站有计划,在计划表中我有通常的ID等,但我也有'space_allowed',这是代表我的一个数字,我已经表示'unlimited'为NULL,这样我就不必改变我的任何(计数)功能。

那么,在我的控制器中,我有这样的内容

$plans = Plan::where('is_active', 1)->get();
return view('pricing', ['plans' => $plans]);

现在,当我在视图中,我只是@foreach在计划和吐出细节。

但是,由于我将'unlimited'空间存储为NULL,因此视图将反映该值。

所以我认为,因为我将引用这整个网站,这将是一个好主意,检查值是否为null,如果是,返回'unlimited',而不是,如果值不是null,那么只是吐出它正常在一个地方。

因此产生了视图编写器的想法。

所以我已经创建了ComposerServiceProvider.php,添加了引导和注册方法,并在引导方法中我有以下内容:

View::composer('*', function ($view) {
});

我想我快到了。

但我失去了如何实现的代码,去闭包检查是否storage_allowed为空

你可以在view composer中通过复制大量数据来做到这一点,所以只需在Blade模板中执行此检查:

@foreach ($plans as $plan)
    ....
    {{ empty($plan->space) ? 'Unlimited' : $plan->space }}
    ....
@endforeach

添加纯粹用于显示的属性有时很有用。我通常在这些后面加上"nice"所以在

上面
class Plan extends Model {
    public function getSpaceNiceAttribute(){
        return is_null($this->space) ? 'Unlimited' : $this->space;
    }
}

然后在模板中使用{{ $plan->space_nice }}

这个方法的好处是,它保持输出一致的任何地方,你需要这个逻辑,而不是复制它在你的模板中的任何地方,并允许更多的条件(例如,如果你想显示"none"而不是"0",你可以使这个函数和所有的模板将反映它)。

对你来说可能有点晚了,但我只是为了将来参考而发布。从控制器传递给视图的任何内容都可以在编写器方法中访问的闭包中访问。例如,如果你有一个从控制器传递过来的页面变量,你就可以像这样从闭包中访问它:

public function compose(View $view)
{
    $page = $view->getData()['page'];
    $data = ['menu' => $this->generateSideBarHTML($page)];
    $view->with($data);
}

现在,您可以从刀片模板访问$菜单。对于您的示例,它将是这样的:

public function compose(View $view)
{
    $plans = $view->getData()['plans'];
    //Iterate on the plans here...
    $view->with($data);
}