使视图依赖于laravel中的变量

时间:2014-03-05 12:58:41

标签: php templates laravel laravel-4 blade

可能只是来自一个更受限制的java背景,但我觉得Laravel中的视图和控制器之间的连接容易出错。例如,考虑一个看起来像这样的控制器

ReceiptController extends BaseController {
    ...
    public function show() {
        $data = array($receipt, $offer);
        View::make('registration', $data);
    }
}

和视图取决于收据对象和商品字符串

...
<div id="receipt">
    <h1>Receipt</h1>
    {{$receipt->items}}
    @if ($receipt->price > 10000)
        <p>{{$offer}}</p>
    @endif;
</div>
...

如果某处的控制器不包含要约字符串怎么办?最糟糕的情况是,在有人购买价格超过10000的东西之前,它可能会被忽视。如果控制器没有通过制作视图所需的所有变量,我将如何抛出错误?如果它还使像PHPStorm这样的IDE能够识别变量,那就获得奖励。

2 个答案:

答案 0 :(得分:1)

您可以使用view composer,并确保无论何时调用收据视图,都会包含优惠。这样你就知道对象总是被传递。

View::composer('receipt', function($view)
{
    $view->with('offer', Offer::get(1));
});

或者您可以直接在视图中处理

<div id="receipt">
    <h1>Receipt</h1>
    {{$receipt->items}}
    @if ($receipt->price > 10000)
       <p>{{$offer or 'Sorry - no special available'}}</p>
    @endif;
</div>

最后 - “最佳”选项始终为test your code,并检查您的视图是否始终使用$ offer变量调用

 $this->assertViewHas('offer');

答案 1 :(得分:0)

如果想要在Controller中工作,如果价格高于某个值,则设置$ var = false并检查是否在视图中。

if($receipt->price > 10000) {
   $offer = $offer;
} else {
   $offer = false;
}

关于PHPStorm和刀片模板引擎之间的兼容性,PHPStorm 7.1不支持它,但是你有助于为下一个版本建立一个更好的世界投票:http://youtrack.jetbrains.com/issue/WI-14172