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()
那样访问它,但我个人认为这太复杂了。
我正在写一些 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()
那样访问它,但我个人认为这太复杂了。