如何在Laravel上以良好的实践方式处理未定义的变量和数组

时间:2013-06-30 16:55:54

标签: php laravel laravel-4 laravel-3

有时我只是因为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 个答案:

答案 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();

如果失败,它会抛出一个异常,就像方法所暗示的那样。