我在Symfony中遇到严重问题,将DateTime转换为字符串。我使用DataTransformer格式化我的Datetime,但是在格式中,出现错误提示:“此值应为字符串类型”。
这是我的代码:我的实体:Shift.php(仅必要)
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="datetime")
* @Assert\DateTime(message="La date de début doit être au format DateTime")
*/
private $start_at;
我的ShiftType:
$builder
->add('start_at', TextType::class, ['attr' => [ 'class' => 'dateTimePicker']])
->add('end_at', TextType::class, ['attr' => [ 'class' => 'dateTimePicker']])
->add('has_eat')
->add('break_duration')
->add('comment')
;
$builder->get('start_at')->addModelTransformer($this->transformer);
$builder->get('end_at')->addModelTransformer($this->transformer);
和我的DataTransformer:
/**
* @param DateTime|null $datetime
* @return string
*/
public function transform($datetime)
{
if ($datetime === null)
{
return '';
}
return $datetime->format('Y-m-d H:i');
}
/**
* @param string $dateString
* @return Datetime|null
*/
public function reverseTransform($dateString)
{
if (!$dateString)
{
throw new TransformationFailedException('Pas de date(string) passé');
return;
}
$date = \Datetime::createFromFormat('Y-m-d H:i', $dateString);
if($date === false){
throw new TransformationFailedException("Le format n'est pas le bon (fonction reverseTransform)" . "$dateString");
}
return $date;
}
正如我所说,当我要提交表格时,表格存在错误。它说:“此值应为字符串类型。”这是由:
引起的Symfony\Component\Validator\ConstraintViolation {#1107 ▼
root: Symfony\Component\Form\Form {#678 …}
path: "data.start_at"
value: DateTime @1578465000 {#745 ▶}
}
[有些破旧,当我要编辑班次时,Symfony从数据库获取日期并将其转换为字符串,而没有任何错误消息。但是,由于我要保存编辑,所以遇到了同样的问题
您能帮我吗?谢谢
过去在表单中使用$ this->时,我遇到过类似的问题。
有时$ this将不包含当前数据。它可能会解释为什么首先要加载它,但是在提交时,它可能无法正确填充。
我建议创建一个自定义表单类型以提高可重用性,并且我知道它的效果很好。
由于您已经拥有DataTransformer类,因此您需要创建一个新的自定义表单类型。这种新的表单类型将扩展TextType并使用datatransformer。
例如:
namespace App\Form\Branch\Type;
use App\Form\Branch\DataTransformer\PhoneFormatTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class PhoneType extends AbstractType
{
private $tools;
public function __construct()
{
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$transformer = new PhoneFormatTransformer();
$builder->addModelTransformer($transformer);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array());
}
public function getParent()
{
return TextType::class;
}
public function getBlockPrefix()
{
return 'phone';
}
}
如果服务未自动接线,则需要添加带有特定标签的服务定义
App\Form\Branch\Type\PhoneType:
tags:
- { name: form.type, alias: phone }
剩下要做的就是在表单构建器中使用新的表单类型:
use App\Form\Branch\Type\PhoneType;
...
$builder
->add('phone', PhoneType::class);
这是一项繁琐的工作,但是它使重用变得非常容易,毫无疑问,每次需要datetime字段时,您都必须这样做。
希望这会有所帮助!