是否可以从访问器返回HTML?

问题描述 投票:1回答:3

我正在使用Laravel框架。我尽可能使用模型返回可在整个应用程序中使用的通用属性。

我的应用程序的一部分跟踪网站的响应时间(到第一个字节的时间/ TTFB)。在我的Website模型中,我将响应时间“分级”为“好”,“差”和“平均”。因此,我有一个返回此访问器。非常简单,也是一种很好的做法:

/**
 * Accessor for TTFB grade (good, bad, average).
 * 
 * @return String
 */
public function getAverageTtfbGradeAttribute()
{
    if($this->average_ttfb < 0.5) {
        $grade = 'good';
    } elseif($this->average_ttfb >= 0.5 && $this->average_ttfb < 1.2) {
        $grade = 'average';
    } else {
        $grade = 'bad';
    }

    return $grade;
}

在整个应用程序中,我想显示TTFB /响应时间,但是我希望它根据成绩显示颜色。我创建了另一个依赖于第一个访问器的访问器:

/**
 * Accessor for TTFB with a colour
 * 
 * @return String
 */
public function getAverageTtfbColoredAttribute()
{
    $str = '<span class="';

    if($this->averageTtfbGrade == 'good') {
        $str.= 'text-success';
    } elseif($this->averageTtfbGrade == 'average') {
        $str.= 'text-warning';
    } else {
        $str.= 'text-danger';
    }

    $str.= '">' . $this->average_ttfb .'s</span>';

    return $str;
}

要使用此功能,我只需要使用$website->averageTtfbColored。它运行完美。

我的问题是,这是好还是坏做法?我的理解是,无论是在控制器,模型还是应用程序的任何其他部分中,HTML都不应该成为业务逻辑的一部分。但是,如果我遵循这种逻辑,那么我将在视图中使用if语句结束该语句,该语句将在我的应用程序中的很多地方重复出现-这与DRY主体背道而驰。

这里的最佳做法是什么?我只是在想吗?

php laravel dry
3个回答
0
投票

这违反了MVC模式,因为您的模型现在也已部分视图。我建议您创建一些小的子视图/组件,例如/resources/views/components/averageTtfd.blade,然后在整个应用程序中使用它们。


0
投票

从逻辑上讲,我认为生成HTML的任何内容都是视图层的一部分,因此实际上并不属于模型。

不过,您也不应在视图层中重复该操作。替代方法包括:

  • 创建局部以渲染项目
  • 创建一个帮助函数以返回正确的值
  • 创建视图模型以处理此逻辑

后一种选项是最复杂的,并且不是Laravel本身提供的,但是周围有第三方实现。


0
投票

您在模型上获取价值的逻辑是完全正确的,它被称为丰富实体,但是您的应用程序可能并不总是在http上运行,这意味着html代码在模型上没有意义,您可以轻松地创建一个为此的刀片模板。

其他一些小建议。使用提前归还,并避免else / elseif

© www.soinside.com 2019 - 2024. All rights reserved.