记录插入之前的 Symfony 3 UcWords

Smyfony 3 UcWords prior to record insert

我确信这非常简单,但我找不到如何做的解释。我有一个表格,要求输入用户名(除其他外)。在我插入记录之前,我想在名称字段上使用 ucwords。

插入记录时如何操作...

$em = $this->getDoctrine()->getManager();
$em->persist($profile);
$em->flush();

有多个地方可以执行此操作。

在您的实体中

classs Profile
{
    //...

    public function setName($name)
    {
        $this->name = ucwords($name);
    }
}

在你的表单中

使用 data transformer

class ProfileType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // ...
        $builder->add('name', TextType::class);

        $builder->get('name')
            ->addModelTransformer(new CallbackTransformer(
                function ($name) {
                    // from model to form (not needed, but won't hurt)
                    return ucwords($name);
                },
                function ($name) {
                    // this is the direction were we need it
                    return ucwords($name);
                },
           ))
    ;
}

还有其他地方,例如Entity Listener 或表单事件,但实际上其中一个地方是我首先要看的地方。如果一般要求名称应该大写,我会使用 setter 以确保它也以这种方式存储。如果您不确定所有数据是否按需要保留,您也可以将其放入实体 getter 中,但即便如此,我也会考虑确保修复格式错误的数据,并确保它以您的格式保存想要,除非有令人信服的理由反对它。

我不会采用评论中建议的组合,因为当有人忘记用 ucwords 调用 setter 时,这会导致数据不一致。