Php Laravel刀片模板在尝试获取非对象的属性时如何返回null而不是ErrorException

Php Laravel刀片模板在尝试获取非对象的属性时如何返回null而不是ErrorException,php,laravel,laravel-5,laravel-blade,Php,Laravel,Laravel 5,Laravel Blade,我正在编写一些Laravel刀片模板,我的模型可能有空对象。我非常想尝试获取object属性,如果有错误,就返回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->

我正在编写一些Laravel刀片模板,我的模型可能有空对象。我非常想尝试获取object属性,如果有错误,就返回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 }}
我可以这样写:

@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 }}
如果子对象为null,则结果的计算结果为null

我只想用我的刀片模板来实现这一点,而不是应用程序中的任何地方(例如,我仍然希望在控制器中得到错误)

有没有一个简单的方法来实现这一点?我也不想每次都在blade模板中尝试/捕获异常

基本上,当我不关心I child是否为null时,我正在尝试使刀片模板更容易/更短地编写,如果为null,则其不存在的属性对于渲染部分也应为null。

您可以将其用作:

array\u get
函数使用“点”表示法从深度嵌套的数组中检索值


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

您可以检查对象中的可空值,并将其初始化为stdClass

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

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

因此,如果我有一个与合同相关的服务模型,并且该合同有一个我想要显示的
start\u日期
,我将向我的服务模型添加一个
getDisplayContractStartDate属性
,并在那里进行检查。这样,如果没有合同,我也可以选择显示消息。像这样:

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';
    }
}
现在,在我的刀片模板的任何地方,我都可以访问
$service->displayContractStartDate
,而不用担心抛出可怕的错误

如果你担心用这些非数据库相关的方法来扩展模型太多,请考虑使用一个特性来包含给定模型的所有 DePosikAtdio/<代码>方法。


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

您可以使用三元,这是我通常做的,并将其全部包含在一个
{}
vs使用
@if
block@Pitchinnate是的,时间短了一点,但我还是要写条件。我很懒,根本不想检查:-)在PHP7中使用
??
操作符<代码>{{$model->property???'default'}
完美,正是我想要的!我喜欢!我还必须像您所展示的那样包装->格式(因为这是显示物品日期的非常常见的事情)。我一直倾向于“fat模型”方法,所以我想我可能会遵循这个模式来处理我知道要在blade中显示的属性。如果它名为'getFormattedContractStartDate',那么我认为它仍然足够通用,可以放在模型中(基本上,模型返回一个stringy属性)。谢谢