刚刚开始使用Symfony,所以请在这里忍受。
我有一个带有字段的实体" myField"它作为ENUM存储在数据库中,其值为' Y'或者' N' (这是我正在使用的旧数据库架构,并尝试将symfony用作应用程序来处理数据)。
我想代表" myField"带有打开或关闭的复选框(0或1)。保存表单后,如何将值转换为适当的“Y'或者' N'在将其持久保存到数据库之前的值?
我查看了Data Transformers,这可能是我需要去的地方,但是创建一个新的类和文件来转换这些数据似乎很愚蠢。这是一个非常简单的转变。
也许我会改变实体上的setMyField($myField) () {}
setter方法来转换那里的数据?同样,将其转换回getMyField() {}
?但是,Doctrine还没有使用setter方法吗?如果是这样,那么当Doctrine设置一个值时,它将是数据库中的正确值(0或1),并且不需要转换。但是如果表单设置了值,则需要进行转换。
这是行动代码:
public function newAction(Request $request)
{
$course = new Course();
$form = $this->createForm(new CourseForm(), $course);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($course);
$em->flush();
return $this->redirect($this->generateUrl('courses'));
}
return $this->render('PucsTestBundle:Course:new.html.twig', array(
'form' => $form->createView(),
));
}
我想我可以在调用handleRequest
之前在控制器中自行转换数据,但这可能不是很好的做法。
此外,我在数据库中有一个字段" days"这只是一个VARCHAR
,就像周一,周二周三的MTW
一样。我想为所有这些值提供一个复选框,然后对表单提交进行后处理,以将数据转换为适当的单个值。
答案 0 :(得分:1)
您应该使用定义的here in the documentation
自定义Doctrine类型<?php
namespace My\Project\Types;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
/**
* My custom datatype.
*/
class OldBooleanType extends Type
{
const NAME = 'OldBoolean'; // modify to match your type name
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
return 'OldBoolean';
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
if ($value === 'Y'){
return true;
}
if ($value === 'N'){
return false;
}
return null;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if ($value === true){
return 'Y';
}
if ($value === false){
return 'N';
}
return null;
}
public function getName()
{
return self::NAME;
}
}
答案 1 :(得分:-1)
来自Symfony文档:http://symfony.com/doc/current/cookbook/form/data_transformers.html
数据转换器用于将字段的数据转换为可以在表单中显示的格式(并在提交时返回)。