【问题标题】:Laravel Blade template how to return null instead of ErrorException when trying to get property of non-objectLaravel Blade模板在尝试获取非对象的属性时如何返回null而不是ErrorException
【发布时间】:2016-12-15 15:50:43
【问题描述】:

我正在编写一些 Laravel Blade 模板,并且我的模型可能包含空对象。我非常想尝试获取对象属性,如果有错误,只需返回 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 }}

如果子对象为空,则结果为空。

我只想对我的刀片模板执行此操作,而不是应用程序中的任何地方(例如,我仍然希望在控制器中得到错误)。

有没有一种简单的方法可以做到这一点?我也真的不想每次都在刀片模板中尝试/捕获异常。

基本上,当我不在乎我的孩子为 null 时,我试图让刀片模板更容易/更短地编写,如果它为 null,那么它不存在的属性也应该为渲染部分的 null .

【问题讨论】:

  • 您可以使用三元组,这是我通常所做的,并将其全部包含在单个 {{ }} 与使用 @if 块中
  • @Pitchinnate,是的,这有点短,但我还是要写条件。我很懒,根本不想检查:-)
  • 在 PHP 7 中使用 ?? 运算符; {{ $model->property ?? 'default' }}

标签: php laravel laravel-5 laravel-blade


【解决方案1】:

您可以将array_get 用作:

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

array_get 函数使用“点”表示法从深度嵌套的数组中检索值。

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

【讨论】:

  • 完美,正是我想要的!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我一直被这个咬伤。当我知道我的对象会有这种数据显示时,我开始在我的对象上添加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() 一样访问它,但我个人认为这太复杂了。

    【讨论】:

    • 我喜欢!我也不得不像你展示的那样包装 -> 格式(因为显示日期是很常见的事情)。我一直倾向于“胖模型”方法,所以我想我可能会遵循这种模式来处理我知道我想在刀片中显示的属性。如果它被命名为“getFormattedContractStartDate”,那么我认为它仍然足够通用,可以在模型中(基本上模型返回一个字符串属性)。谢谢!
    猜你喜欢
    • 2017-08-02
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2015-09-17
    • 2021-07-19
    • 2016-11-30
    相关资源
    最近更新 更多