Laravel Blade 模板在尝试获取 non-object 的 属性 时如何 return null 而不是 ErrorException

Laravel Blade template how to return null instead of ErrorException when trying to get property of non-object

我正在写一些 Laravel Blade 模板,我的模型可能有空的 object。我非常想尝试获取 object 属性 如果有错误,只是 return null.

所以不用写这个:

@if ($model->child_object_that_may_be_null)
    {{ $model->child_object_that_may_be_null->interesting_property }}
@endif

我可以这样写:

{{ $model->child_object_that_may_be_null->interesting_property }}

如果 child object 为空,则结果计算为空。

我只想用我的 blade 模板来做这件事,而不是在应用程序的任何地方(例如,我仍然想在控制器中得到错误)。

有没有简单的方法可以做到这一点?我也真的不想每次都在 blade 模板中出现 try/catch 异常。

基本上,我试图让 blade 模板 easier/shorter 在我不关心 child 是否为 null 时编写,如果它为 null 那么它的 non-existent 属性 渲染部分也应该为空。

您可以将 array_get 用作:

{{ array_get($model, 'child_object_that_may_be_null.interesting_property') }}

The array_get function retrieves a value from a deeply nested array using "dot" notation.

注意 - 它可能只适用于 Laravel 的模型对象

您可以检查对象中的可为 null 的值并将它们初始化为 stdClass。

$properties = get_object_vars($model);
foreach ($properties as $k => $v) {
    if ($v === null) $model->$k = new stdClass;
}

我一直被这个困扰。当我知道我的对象将具有这种数据显示时,我开始在我的对象上添加 displayAttribute 访问器。在涉及日期或多层次关系时特别有用。

所以如果我有一个与合同相关的服务模型,并且该合同有一个我想显示的 start_date,我将向我的服务模型添加一个 getDisplayContractStartDateAttribute 并执行那里的支票。这样我也可以选择在没有合同的情况下显示一条消息。像这样:

public function getDisplayContractStartDateAttribute(){
    if ($this->contract && $this->contract->starts_at){
        return $this->contract->starts_at->format('m/d/Y @ g:i a');
    } else {
        return 'Start date or contract missing';
    }
}

所以现在我的 Blade 模板中的任何地方,我都可以访问 $service->displayContractStartDate 而不必担心抛出那个可怕的错误。

如果您担心使用这些与数据库无关的方法过度扩展模型,请考虑使用 Trait 来包含给定模型的所有 displayAttribute 方法。

或者,如果您担心关注点分离,您可以使用装饰器并像 $service->decorator->contractStartDate() 那样访问它,但我个人认为这太复杂了。