我有一个数据转换器,用于将浮点数转换为一个看起来像时间或持续时间的字符串。例如,数据库中的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
)。这会伤害表现吗?什么是更好的方式?
我认为这应该是一个常见的问题,因为您几乎不会将数据转换为放入数据库但从未向用户显示数据。
答案 0 :(得分:0)
您的FloatToTimeTransformer转换方法可以调用TimeUtil类中存储的静态类方法。 然后你的twig扩展现在可以调用相同的外部静态类方法。
注意:此方法应该在dataTransformer中捕获特定异常
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)
}
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());
}
}