【问题标题】:Show formatted properties in Laravel's blade template在 Laravel 的刀片模板中显示格式化的属性
【发布时间】:2018-03-12 19:19:41
【问题描述】:

假设,我有一些 Modelupdated_at 属性。我想在这样的模板中显示它

{{ $model->updated_at }}

这可以在很多地方使用,所以我不这样做

{{ $model->updated_at->format('d/m/Y H:i:s') }}

但是

public function getUpdatedAtAttribute($value)
{
    return $value->format('d/m/Y H:i:s');
}

但是这个解决方案有一个大问题,我不能再在控制器中使用$model->updated_at,因为它返回的是字符串,而不是 Carbon 实例。

两种可能的解决方案

1.

public function getUpdatedAtFormatterAttribute($value)
{
    return $this->updated_at->format('d/m/Y H:i:s');
}

在模板中

{{ $model->updated_at_formatted }}

2.

使用像this这样的包

class ModelPresenter extends Presenter {

    public function updated_at()
    {
        return $this->updated_at->format('d/m/Y H:i:s');
    }
}

{{ $model->present()->updated_at }}

从架构的角度来看,我认为第二个版本更简洁,但有一些经过验证的解决方案吗?这不仅仅是关于 Laravel,而是关于任何流行的 PHP 框架。

【问题讨论】:

  • 嗨,我也有同样的问题。我想和你讨论一下……你有脸书之类的,我们可以聊天吗?我认为我已经为此制定了解决方案,但如果它也适用于您,想听听您的意见。
  • 这个问题是 Yii2 还是 laravel 的?
  • Laravel 的更多内容,但我认为 Yii2 中也存在问题
  • 我使用你的第一种方法,除非应用程序真的很大,我通常有一个存储库接口,并且在需要时我在存储库顶部实现一个“presenter”/“transformer”。
  • @devk 我想看看那个“presenter”/“transformer”你有脸书之类的吗?

标签: laravel model-view-controller architecture yii2


【解决方案1】:

试试这个 - 不要忘记调用模型 - 使用 Carbon\Carbon; 型号:

public function getUpdatedAtAttribute($updated_at)
{
    return Carbon::parse($updated_at)->format('d/m/Y H:i:s');
}

在你的刀片视图中像这样调用

{{$model->getUpdatedAtAttribute($updated_at)}}

【讨论】:

  • 你试过了吗?
【解决方案2】:

问题中描述的两种方法实际上是 在 Laravel 模型上添加 DRY 日期格式的标准且被广泛接受的方法:

  • 为特定日期格式的模型添加一个或多个访问器
  • 使用 presenter 将模型与显示逻辑包装在一起

这两种方法都将格式化逻辑整合到一个位置,因此我们可以稍后根据需要更新格式,而无需更改输出日期的每一行。两者还避免覆盖源属性,以便在需要时可以使用该功能。

选择哪一个取决于应用程序的大小和要求。具有小团队的小型应用程序当然可以证明第一种方法的合理性,该方法通过添加演示者层来避免引入复杂性。第二种方法可能适合可以从抽象和关注点分离中受益的大型团队。

在某些应用程序中,我喜欢创建一个特征,我们可以将其添加到任何模型中,从而使用模型上声明的日期和日期格式启用自动日期格式化属性:

class User extends Model 
{
    use FormatsDates; 

    protected $dates = [ 'last_login_at' ]; 
    ...
}

$user->formatted_last_login_at; // mm/dd/yyyy

因为这个问题在其范围内不包含这样的特征,所以我将把实现作为练习留给读者,但如果需要,我很乐意提供帮助。

【讨论】:

  • 为什么我不能以这种格式“d.m.Y H:i”保存日期,即使我将它添加到模型中的 $dates[ ] 数组中?
  • @lewis4u,以不同格式保存日期时需要考虑几个因素。如果数据库列存储格式为d.m.Y H:i,则可以将模型上的$dateFormat 属性设置为some。否则,您需要先转换日期:$model->some_date = Carbon::createFromFormat('d.m.Y H:i', $someDate); $model->save();。您可以考虑将此属性的修改器添加到特定日期格式的模型中。
  • 如果我想为任何模型(如 Trait)创建一个通用 mutator 怎么办...我已经创建了一个但想与您讨论它,看看它并说出您的意见...
猜你喜欢
  • 2014-09-14
  • 2014-11-07
  • 1970-01-01
  • 2020-03-18
  • 2014-11-18
  • 2018-09-24
  • 2018-09-05
  • 2019-01-15
  • 2020-09-22
相关资源
最近更新 更多