2

有时我得到一个例外只是因为 foreach 标记的供应不包含数组。

喜欢;

//controller
->with('array', Something::all());

//view
@foreach ($array as $k => $v)
   {{ $v }}
@endforeach

如果Something::all() returns null(这是常见的if Something model doesn't contain any data),foreach将抛出异常,因为$array它实际上不是一个数组,它是一个NULL.

我知道我们可以通过多种方式防止这种异常。

如果未设置值,请在控制器中检查并推送一个空数组;

->with('array', Something::all() ?: array());

或者,甚至在视图文件中进行;

@if(!empty($array))
    @foreach ($array as $k => $v)
        {{ $v }}
    @endforeach
@endif

两者都可以正常工作,但我真的想知道在 Laravel 中处理这个问题的最佳实践是什么。在控制器中?在视野中?别的地方?完全不同的概念?我想学习处理这个问题的最佳实践。

附言。我举了一个 Laravel 的例子,但也欢迎非 Laravel 的响应。

4

4 回答 4

3

已经有一段时间了,我相信这是迄今为止最好的解决方案。

@if(!$something->isEmpty())
    @foreach($something as $k => $v)
        ...
    @endforeach
@endif

原因是,当响应是一个对象时,通常像 empty/isset 这样的检查会失败。他们投掷true并打破了前锋。

isEmpty()另一方面,处理这些问题本身。

于 2014-04-01T17:23:55.747 回答
1

另一个潜在的选择如下,但我担心这在视图中有点过于逻辑。

@foreach ($array ?: array())
    ...
@endforeach
于 2013-07-01T04:45:23.307 回答
1

虽然,在视图中保持逻辑最小化是“最佳”实践;我不会为了最佳实践而牺牲可读性、便利性和用户体验。

如果数据数组为空,您可能希望向用户显示一些消息,对吗?因此,执行以下操作似乎是合乎逻辑的。

@if(!empty($array))
  <table>
  @foreach ($array as $k => $v)
    <tr><td>{{ $v }}</tr></td>
  @endforeach
  </table>
@else:
  <div class="alert">No records found.</div>
@endif
于 2013-07-01T07:22:41.693 回答
0

我已经在控制器中检查了这一点,我总是尽量在我的视图中保持逻辑最小化。

但我觉得可能会有更多的 Laravelish 风格,也许可以使用 Eloquent 来做这个,像这样:

$model = User::findOrFail(1);

$model = User::where('votes', '>', 100)->firstOrFail();

如方法所建议的,如果失败,它会抛出异常。

于 2013-06-30T17:29:42.800 回答