在Symfony

时间:2017-03-22 07:21:27

标签: php performance symfony inversion-of-control

我有一个数据转换器,用于将浮点数转换为一个看起来像时间或持续时间的字符串。例如,数据库中的165.3将转换为我的表单中的'2:45.3',反之亦然会返回到数据库中。这适用于我的所有表单,但我希望数据以字符串格式显示在树枝模板中,以便用户可以看到某些内容的持续时间为'2:45.3'而不是165.3

为了做到这一点,我扩展了twig以获得过滤器secs2time,并在树枝扩展中使用数据转换器(而不是重写相同的逻辑)来将float更改为字符串。它看起来像这样:

public function secs2time($secs)
{
    return (new FloatToTimeTransformer)->transform($secs);
}

这很有效,但我觉得有更好的方法。在我的枝条扩展中导入和使用FloatToTimeTransformer是不是很糟糕? Symfony变换器导入至少两个我的twig扩展中不需要的其他类(DataTransformerInterface& TransformationFailedException)。这会伤害表现吗?什么是更好的方式?

我认为这应该是一个常见的问题,因为您几乎不会将数据转换为放入数据库但从未向用户显示数据。

1 个答案:

答案 0 :(得分:0)

您的FloatToTimeTransformer转换方法可以调用TimeUtil类中存储的静态类方法。 然后你的twig扩展现在可以调用相同的外部静态类方法。

注意:此方法应该在dataTransformer中捕获特定异常

在Model或Utils src目录中

namespace \Model
use \DateTime

class TimeUtils
{
    public static secToTime($aFloat)
    {
        $time = "";
        ...// implements your transformation

        return $time;
    }

    public static timeToSec($aFloat)
    {
        $time = "";
        ...// implements your transformation

        return $time;
    }
}

在你的枝条扩展

use Model\TimeUtils

...

public function secs2time($secs)
{
    return TimeUtils::secToTime($sec)
}

在您的dataTransformer

use Model\TimeUtils

...

public function transform($secs)
{
    try {

        return TimeUtils::secToTime($sec)
    } catch (\Exception $e) {
        throw new TransformationFailedException($e->getMessage());
    }
}

public function reverseTransform($time)
{
    try {
        return TimeUtils::timeToSec($time)
    } catch (\Exception $e) {
        throw new TransformationFailedException($e->getMessage());
    }
}