如何在laravel刀片中抑制“在null上调用成员函数函数()”错误?

时间:2017-01-31 12:59:35

标签: php laravel blade laravel-blade

我在刀片模板中有这个代码:

{{ $birthday->format('m/d/Y') }}

当$ birthday为null时,我收到此错误,如何抑制此异常?

我想在$ birthday为null时显示空字符串,我尝试了这两个解决方案但没有成功:

{{ $birthday->format('m/d/Y') or '' }}

{{ @$birthday->format('m/d/Y') }}

有什么建议吗?我想刀片解决方案不是雄辩的模型...

9 个答案:

答案 0 :(得分:2)

来自Eloquent模型的日期会返回Carbon/Carbon个对象,如果未设置,则会返回null。如果您希望日期为空字符串(如果不存在),则可以创建accessor

class Foo extends Eloquent {
    public function getBirthdayAttribute() {
        return isset($this->attributes['birthday']) && $this->attributes['birthday'] instanceof \DateTime ? $this->attributes['birthday']->format('m/d/Y') : '';
    }
}

答案 1 :(得分:2)

所有其他答案过于复杂,或者在您需要对有问题的变量调用函数的情况下将无法使用。 幸运的是,Laravel对此有一个很好的技巧。您可以使用git init repo cd repo git branch -m master slave 助手:

optional

自Laravel 6起可用 https://laravel.com/docs/8.x/helpers#method-optional

答案 2 :(得分:1)

试试这个:

{{isset($生日)? $ birthday->格式(' m / d / Y'):'' }}

答案 3 :(得分:1)

您可以使用@if@elseif@else@endif指令构建blade if语句。这些指令的功能与它们的PHP对应程序完全相同:

  @if($birthday)
    {{ $birthday->format('m/d/Y') }}
   @endif

注意:在@if中使用@foreach $x会为每个$x重复if语句 More about Laravel Blade

修改

这是您正在寻找的优雅解决方案

{{ $birthday->format('m/d/Y')  ?: '' }}

答案 4 :(得分:1)

您可以使用null coalesce为变量设置默认值。

{{ $var ?? 'default' }}

或者如果你有PHP <7

<?php isset($var) ? $var  : 'default'; ?>

{{ $var }}

答案 5 :(得分:1)

使用三元运算符:

{{ is_null($birthday) ? '' : $birthday->format('m/d/Y') }}

答案 6 :(得分:1)

从PHP 8.0开始,您可以使用nullsafe operator (?->),而当$birthday为null时,它将整个表达式转换为null。

{{ $birthday?->format('m/d/Y') }}

答案 7 :(得分:0)

我的解决方案是扩展刀片:

class AppServiceProvider extends ServiceProvider
{
    /**
     * Perform post-registration booting of services.
     *
     * @return void
     */
    public function boot()
    {
        Blade::directive('datetime', function ($expression) {
            if($expression == null){
                return '';
            }else{
                return "<?php echo ($expression)->format('m/d/Y'); ?>";
            }
        });
    }

    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

答案 8 :(得分:0)

我经常使用

{{ $var->prop ? $var->prop->format('d/m/Y') : '' }}