Laravel:无法将变量传递给视图

时间:2014-11-14 13:17:52

标签: laravel laravel-4 laravel-routing

我有几个使用继承的刀片页面,我试图在一个页面中显示产品列表。但是,当对象传递给视图时,某些内容出错并且会导致应用程序崩溃。

我得到的错误是Undefined variable: batteries

使用isset($batteries)我测试了变量确实没有进入视图。

以下是代码:

/* controller */

class HomeController extends \BaseController {

    public function index() {
        $view = View::make('home.index')->render();
        return Response::json(['view' => $view]);
    }

    public function main() {
        $batteries = Battery::all();
        $view = View::make('home.main', compact('batteries'))->render();
        return Response::json(['view' => $view]);
    }

}

查看:

<!-- home/index.blade.php -->
@extends('layouts.master')

@section('content')

@include('home.main')

@stop

<!-- home/main.blade.php -->
<ul class="list-group">
    @foreach ($batteries as $battery)
        <li class="list-group-item">$battery->name</li>
    @endforeach
</ul>

有什么问题?为什么变量未定义?

修改

Route::get('/', function() {
    return View::make('home.index');
});

Route::group(['before' => 'ajax'], function() {
    Route::get('/home/main', ['as' => 'home.main', 'uses' => 'HomeController@main']);
});

2 个答案:

答案 0 :(得分:0)

问题在于index方法显示home.index此文件包含home.main,在此文件中您使用$batteries变量。

您不应在此处添加home.main模板,或在设置$batteries时添加额外检查:

@if (isset($batteries))
<ul class="list-group">
    @foreach ($batteries as $battery)
        <li class="list-group-item">{{{ $battery->name }}}</li>
    @endforeach
</ul>
@endif

要显示$ battery的名称,您还应该使用{{{ $battery->name }}}而不只是$battery->name

修改

问题是你的路线,应该是使用你的控制器方法:

Route::get('/', ['uses' => 'HomeController@index']);

现在您可以将index方法更改为:

$batteries = Battery::all();
$view = View::make('home.main', compact('batteries'))->render();
return Response::json(['view' => $view]);

答案 1 :(得分:0)

您不会从$batteries方法发送index变量,因此当然不会有。{1}}变量。仅因为您包含main视图而无法运行main.blade.php方法。

您需要在index方法中执行与main方法相同的操作。

public function index() {
    $batteries = Battery::all();
    $view = View::make('home.index', compact('batteries'))->render();
    return Response::json(['view' => $view]);
}