有时我只是因为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的回应。
答案 0 :(得分:3)
已经有一段时间了,我相信这是迄今为止最好的解决方案。
@if(!$something->isEmpty())
@foreach($something as $k => $v)
...
@endforeach
@endif
原因是,当响应是一个对象时,通常像empty / isset这样的检查会失败。他们施放到true
并打破了foreach。
isEmpty()
处理这些问题本身。
答案 1 :(得分:1)
另一个可能的选择如下,但我担心视图中的逻辑太多。
@foreach ($array ?: array())
...
@endforeach
答案 2 :(得分: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
答案 3 :(得分:0)
我已经在控制器中检查了这个,我总是试图在我的视图中保持逻辑最小化。
但是我觉得可能会有更多的Laravelish风格,也许可以使用Eloquent来做这样的事情:
$model = User::findOrFail(1);
$model = User::where('votes', '>', 100)->firstOrFail();
如果失败,它会抛出一个异常,就像方法所暗示的那样。