记录插入之前的 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);
}
}
在你的表单中
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 时,这会导致数据不一致。
我确信这非常简单,但我找不到如何做的解释。我有一个表格,要求输入用户名(除其他外)。在我插入记录之前,我想在名称字段上使用 ucwords。
插入记录时如何操作...
$em = $this->getDoctrine()->getManager();
$em->persist($profile);
$em->flush();
有多个地方可以执行此操作。
在您的实体中
classs Profile
{
//...
public function setName($name)
{
$this->name = ucwords($name);
}
}
在你的表单中
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 时,这会导致数据不一致。