【问题标题】:Undefined Variable Error in Laravel 5.2Laravel 5.2 中的未定义变量错误
【发布时间】:2016-05-10 04:53:31
【问题描述】:

我是 PHP 和 Laravel 的新手,我尝试构建简单的 Web 应用程序以熟悉 PHP 和 Laravel。我在刀片文件中得到一个undefined variable。如果有人能帮我解决这个问题,我们将不胜感激。

基本上,我想要发生的是: 我有一个名为dashboard.blade.php 的视图,在这个视图中有一个文本字段和按钮。输入房间号并单击按钮后,必须将房间号保存在数据库中,并且需要刷新当前视图,但这一次,新房间必须显示在顶部。房间毫无问题地保存在数据库中,但是当我尝试使用 foreach 循环检索它时,我收到 'undefined variable rooms' 错误

我正在使用 Laravel 5.2

与触发此操作有关的按钮(在 dashboard.blade.php 中)

<form action="{{ route('viewroom') }}" method="POST"> //route is viewroom
        Please Insert The New Room Number<br>
        <input type="text" name="roomid"/>
        <button type="submit">Add New Room</button>
        <input type="hidden" value="{{ Session::token() }}" name="_token"/>
</form>

路由文件

Route::post('/dashboard',[
    'uses' => 'RoomController@InsertRoom',
    'as' => 'viewroom'
]);

RoomController 中使用的函数

public function InsertRoom(Request $request){
    $this->validate($request, [
        'roomid' => 'required | numeric | unique:insert_rooms',
    ]);

    $room = new InsertRoom();
    $room->roomid = $request['roomid'];
    $room->status = 0;
    $room->save();

    $rooms = InsertRoom::all();

    $request->session()->flash('alert-success', 'Room was successful added!');
    return view('dashboard', ['rooms' => $rooms]);
}

在dashboard.blade.php中:

<div class="border1">
    @if(isset($results))
        @foreach($rooms as $room)
            <a href="#">$room->roomid</a>
        @endforeach
    @endif
</div>

我们将不胜感激。谢谢

更新 我忘了澄清这一点,在我使用 if 条件检查是否设置了 $errors 之前,我收到了错误“未定义的变量 $rooms”。在我使用 if(isset($errors)) 之后,我没有再收到错误,但我想显示的信息没有显示

更新 2

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Dashboard</title>

<style>
    h1{
        text-align: center;
    }

    .border1{
        border: dotted;
        border-color: red;
        text-align: center;
        padding: 20px;
    }

    .ulerror{
        text-align: center;
        color: red;
    }

    .flash-message{
        text-align: center;
        font-weight: bolder;
        color: lawngreen;
    }

    ul li{
        font-family: "Lucida Console";
        font-size: 24px;
        list-style: none;
        padding: 10px;
    }

    a{
        padding: 8px;
    }
</style>

</head>
<body>

<h1>Dashboard</h1>

<div class="border1">

    @if(isset($rooms))
        {{--{{ dd(isset($rooms)) }}--}}
        @foreach($rooms as $room)
            <a href="#">{{ $room->roomid }}</a>
        @endforeach
    @endif
    {{--<a href="{{ route('roomdetails', ['id' => '1', 'status' => 'free'])        }}">1</a> IGNORE THIS--}}

</div>

<br><br><br>

<div class="border1">
    <b>Insert a new Room</b>
    <br><br>
    <form action="{{ route('viewroom') }}" method="POST">
        Please Insert The New Room Number<br>
        <input type="text" name="roomid"/>
        <button type="submit">Add New Room</button>
        <input type="hidden" value="{{ Session::token() }}" name="_token"/>
    </form>
</div>

<div class="flash-message">
    @foreach (['danger', 'warning', 'success', 'info'] as $msg)
        @if(Session::has('alert-' . $msg))

            <p class="alert alert-{{ $msg }}">{{ Session::get('alert-' .  $msg) }} <a href="{{ route('backhome') }}" class="close" data-dismiss="alert" aria-label="close">&times;</a></p>
        @endif
    @endforeach
</div> {{--flash message--}}

@if(count($errors) > 0)
    <div class="ulerror">
        <ul>
            @foreach($errors->all() as $error)
                {{ $error }}
            @endforeach
        </ul>
    </div> {{--error handling--}}
@endif

【问题讨论】:

  • $rooms = InsertRoom::all(); dd($rooms); 显示什么?
  • @AlexeyMezenin 基本上我想从 insert_rooms 表中检索所有行并将其存储在对象 $rooms 中。然后将变量 $rooms 传递到视图中,并通过使用 '$room->roomid' 我尝试仅获取我想要显示的房间 ID。希望我很清楚
  • 我看到了。 ) 为了能够帮助你,我需要和你一起调试它。请使用我之前评论中的代码并告诉我输出。
  • @AlexeyMezenin 对不起,我的错……我以为你在问代码的作用。当我输入 dd($rooms) 时,我得到以下输出: Collection {#207 ▼ #items: array:13 [▶] }
  • 好的,现在删除 dd 并将其添加到视图中(在 foreach 之前):{{ dd(isset($rooms)) }}

标签: php laravel


【解决方案1】:

你应该试试

<div class="border1">
@if(isset($rooms))
    @foreach($rooms as $room)
        <a href="#">{{$room->roomid}}</a>
    @endforeach
@endif

【讨论】:

  • 嗯...现在可以了。我不得不用双花括号将 $room->roomid 括起来......忘记这一点我觉得很愚蠢。非常感谢您的帮助
【解决方案2】:

拼写错误:房间而不是结果。您尚未将任何名为“结果”的变量从控制器传递给查看。

您只需要检查结果对象(房间)是否已设置。您可以使用以下任何方法来执行此操作。

所有将返回布尔结果真或假。

@if($rooms)
    @foreach($rooms as $room)
        <a href="#">{{$room->roomid}}</a>
    @endforeach
@endif

@if(!empty($rooms))
    @foreach($rooms as $room)
        <a href="#">{{$room->roomid}}</a>
    @endforeach
@endif

@if(isset($rooms))
    @foreach($rooms as $room)
        <a href="#">{{$room->roomid}}</a>
    @endforeach
@endif

【讨论】:

    【解决方案3】:

    而不是这样做: return view('dashboard', ['rooms' => $rooms]);

    只需在获取视图功能中打印出所有房间。然后在您的 insertRooms 函数中执行以下操作: 返回重定向()->返回();

    相反,由于页面刷新,您的 get 视图将自动打印出新值 :-)

    请开始使用 compact 方法将变量返回到您的视图中,我一直是 sine laravel 5.1 的最佳实践 :-)

    我还建议您观看一些有关命名约定的视频。祝你好运!

    【讨论】:

    • 感谢您的帮助!使用紧凑方法返回变量是否有原因?另外,我应该降级到 Laravel 5.1 吗?在阅读 Laravel 时,我听说 Laravel 5.2 很快就会过时,但我不明白,因为 Laravel 5.1 不应该在 5.2 之前过时吗?
    • 据我所知和我自己的经验,这主要是由于代码的可读性。我刚刚将一个项目升级到 5.2 所以我希望不是
    猜你喜欢
    • 2016-04-01
    • 2016-06-02
    • 2016-04-05
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多