Symfony TimeType 设置默认值没有重复值或覆盖

Symfony TimeType set default value without duplicate value or overwrite

我正在尝试制作一个用户友好的时间选择器。我使用 symfony 4.4 和表单生成器来创建这个时间选择器。我在创建我的实体和编辑我的实体时使用这个时间选择器。现在我 运行 遇到一个小问题...我希望时间处于特定的“默认”值。所以我做了以下。

$builder
    ->add('start_time', TimeType::class, [
        // Make sure I only see one of those values.
        'minutes' => [0, 15, 30, 45],
        // Always sets it to 7:30 even when im editing...
        'data' => new \DateTime('07:30')
    ])
    ->add('end_time', TimeType::class, [
        'minutes' => [0, 15, 30, 45],
        // Kinda works but it shows a duplicate value when selecting a value.
        'placeholder' => [
            'hour' => '16',
            'minute' => '30'
        ]
    ])
    ;
}

'data' 对象不起作用,因为当我使用此表单编辑我的实体时,它会覆盖数据库中保存的数据。 Symfony 也在 documentation:

中对此进行了解释

The data option always overrides the value taken from the domain data (object) when rendering. This means the object value is also overridden when the form edits an already persisted object, causing it to lose its persisted value when the form is submitted.

'placeholder' 对象确实解决了这个问题,但在 select 字段中显示重复值,如下所示:

我只想要没有重复值的默认值或在编辑时覆盖规则。

可能的解决方案: 我可以将 'data' 对象仅用于创建实体部分。然后使用构建器的副本创建一个新的实体类型 class 但现在没有 'data' class 所以它从数据库加载时间。这个新的 class 我将用于编辑实体部分。可悲的是,这是一个丑陋的修复,因为我复制了整个 class 只是为了默认值。

您可以直接在 entity/model 中设置您想要的“时间”,例如在您的“新控制器操作”中 $myEntity->setTime(...) 并让 Symfony 和 Doctrine 在您的“编辑”中完成它们的工作控制器动作”。