如何在Blade中实现,如果值未设置则输出默认值?

62

如果没有设置给定值,我想知道显示默认值的最佳方法是什么。我在blade文件中有以下内容(我不能保证键是否设置,这取决于多种因素)。

{{ $foo['bar'] }}

我想知道以下是否是最佳做法:

{{ (isset($foo['bar']) ? $foo['bar'] : 'baz' }}

还有更好的方法吗?

谢谢:)

6个回答

159

使用 PHP 的 null 合并运算符:

{{ $variable ?? "Default Message" }}

从 Laravel 5.7 开始已经被移除

在 Laravel 4.1-5.6 中,你可以像这样轻松地完成它:

{{ $variable or "Default Message" }}

这与以下内容相同:

echo isset($variable) ? $variable : 'Default Message'; 

哇,那很不错,但你不觉得这样的逻辑应该被保持在视图之外吗? - Chris Bier
但是对于登录页面上的错误框,我需要一个实际的 if(isset($error)){ <div class="error">$error</div> } ,而不仅仅是$error中包含的值。(注:这只是伪代码) - FMaz008
1
如果“default”是一个表达式(函数调用等),而不是一个字符串,则必须使用PHP的方式(参见@joemaller的帖子)。 - Cedric
2
``{{$Variable ?? "Default Message"}}` 请参考@Edmund的Laravel 5.7答案。 - Yako
1
Jazerix请更新您的答案,包括Edmund Sulzanok对于laravel 5.7及以上版本的答案。 - Bobby Axe
显示剩余6条评论

21

PHP 5.3 的三元运算符快捷语法在 Blade 模板中也适用:

{{ $foo->bar ?: 'baz' }}

它不能处理未定义的顶级变量,但对于处理数组和对象中的丢失值非常有用。

此外,例如,如果我们想要显示组织创建的日期,但该日期可能不存在(例如,如果我们手动从数据库中创建它,并且不链接到任何记录以获取该字段),那么可以执行以下操作:

{{ $organization->created_at ? $organization->created_at->format('d/m/Y H:i') : "NULL" }}

是的,这样做可以。但为什么Laravel的快捷方式不起作用呢? - ssi-anik
3
{{ @$foo->bar ?: 'baz' }} 这行代码可以避免在 bar 没有被设置的情况下输出错误信息,如果 bar 没有被设置,则输出 "baz"。 - Cedric
3
这种方法不是很好。如果“bar”属性的值为零、null或false,则可能会破坏您的代码。如果“bar”是其中之一,它将打印出“baz”。 - spetsnaz

12
自Laravel 5.7起,{{$Variable or "Default Message"}}将抛出$Variable未定义的异常。然而,使用{{$Variable ?? "Default Message"}}则可以正常工作。

1
此外,{{$variable or 'Default Message'}} 编译为 <?php echo e($variable or 'Default Message'); ?>,而不是 echo isset($variable) ? $variable : 'Default Message'; - R. Wang

5
我建议在控制器中设置默认值,而不是在视图中进行工作。这是最好的方法,因为它可以让逻辑保持在视图之外,并使视图的标记清晰明了。
例如,在将数据传递给视图之前,在控制器中进行如下设置:
if(!isset($foo['bar'])){
     $foo['bar'] = 'baz';
}

1
我曾希望有一个模板解决方案,可能类似于{{ $foo['bar'] | 'baz' }},但我得出的结论是这不是一项功能。 - paquettg
2
是的,我认为不是这样的,因为这不是视图的目的。视图只是应该显示在控制器中预先准备好的数据。最好尽可能地将逻辑从视图中分离出来。这样可以保持关注点分离,并很好地遵循MVC指南。 - Chris Bier
如果你想把它放在视图中,你提出的方法看起来是最好的方法。 - Chris Bier

2

通常我使用空合并运算符(在 PHP 7.0 中引入):

{{ $foo['bar'] ?? 'baz' }}

然而,如果'baz'实际上是一个长表达式(比如几行HTML,可能带有一些PHP变量),那么我会使用Blade的@isset语句(@else是可选的但也可以使用):

@isset($foo['bar'])
    {{ $foo['bar'] }}
@else
    {{ $b }}
    <br>
    {{ $a }}
    <br>
    {{ $z }}
@endisset

(稍微改变一下例子。)
还有@empty($expr),语法类似但与同名的PHP函数相同。这可能会有所帮助:在哪里应该使用isset()和!empty()

0

虽然Chris B的回答完全有效,但我觉得这可能是一个可以有另一种答案的问题。有些人可能不想让他们的控制器变得“臃肿”,在这种情况下,使用Presenter可能是您寻找的答案,以允许应用程序视图具有很大的灵活性。

请查看Github上的以下project/package。自述文件非常强大,提供了许多示例供您参考。

它将允许您做到您所要求的,并简单地调用

{{ $foo['bar'] }}

在你的视图中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接