Symfony 4 - невозможно преобразовать значение для пути свойства "[myDateTime]": ожидается \ DateTimeInterface - PullRequest
0 голосов
/ 14 сентября 2018

Я хочу визуализировать средство выбора даты и времени с помощью форм Symfony.

Поскольку для выбора даты и времени требуется только ввод текста (поскольку он возвращает простую строку), я решил использовать форму DataTransformers для преобразования данных из даты и времени в строку и наоборот. Но когда я пытаюсь отобразить свою страницу, я получаю следующее сообщение об ошибке:

Невозможно преобразовать значение для пути свойства "[myDateTime]": ожидается \ DateTimeInterface.

Мой класс контроллера выглядит следующим образом:

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;

/**
 * Class HomeController
 * @package App\Controller
 */
class HomeController extends Controller
{    
    /**
     * @Route("/test", name="form_test")
     */
    public function testForm(Request $request)
    {
        $data = ['myDateTime' => new \DateTime()];
        $builder = $this->createFormBuilder($data)
            ->add('myDateTime', DateTimeType::class, ['label' => 'My datetime']);

        $builder
            ->get('myDateTime')
            ->addModelTransformer(new DateTimeToStringTransformer(null, null, 'd/m/Y H:i'));

        $form = $builder->getForm();
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            dump($form->getData());
        }

        return $this->render('test.html.twig', [
            'form' => $form->createView(),
        ]);
    }
}

Шаблон моего представления настолько прост:

{% extends 'base.html.twig' %}

{% block body %}
    {{ form_start(form) }}
        {{ form_widget(form) }}
        <button class="btn btn-success">{{ button_label|default('Send') }}</button>
    {{ form_end(form) }}
{% endblock %}

Для визуализации моего средства выбора даты и времени я использовал темы форм, хранящиеся в form / fields.html.twig:

{% use "bootstrap_4_layout.html.twig" %}

{% block datetime_row %}
    <div class="form-group">
        {{ form_label(form) }}
        {{ form_errors(form) }}
        {{ form_widget(form) }}
        {{ form_help(form) }}
    </div>
{% endblock %}

{% block datetime_widget %}
    <div class="input-group date" id="{{ id }}" data-target-input="nearest">
        <input type="text" class="form-control datetimepicker-input" data-toggle="datetimepicker" data-target="#{{ id }}" {% if value %}value="{{ value|e('html_attr') }}"{% endif %}/>
        <div class="input-group-append" data-target="#{{ id }}" data-toggle="datetimepicker">
            <div class="input-group-text"><i class="fa fa-calendar"></i></div>
        </div>
    </div>
{% endblock datetime_widget %}

И добавил эту тему в конфигурационный файл twig.yaml:

twig:
    paths: ['%kernel.project_dir%/templates']
    debug: '%kernel.debug%'
    strict_variables: '%kernel.debug%'
    form_themes:
        - 'bootstrap_4_layout.html.twig'
        - 'form/fields.html.twig'

Кто-нибудь помогает мне понять, почему это не работает или что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вам не нужно DateTimeToStringTransformer. Убери этот Трансформер. По умолчанию Symfony DateTimeType ожидает объект \DateTime.

Итак, ваш преобразователь преобразует его в строку, а затем DateTimeType ожидает DateTime, но получает строку, поэтому он вызывает эту ошибку.

Вы можете прочитать больше здесь: https://symfony.com/doc/current/reference/forms/types/datetime.html#input

0 голосов
/ 14 сентября 2018

Чтобы ваша форма работала правильно, вы должны использовать TextType вместо DateTimeType для поля myDateTime:

$builder = $this->createFormBuilder($data)
        ->add('myDateTime', TextType::class, ['label' => 'My datetime']);

Объяснение:

Symfony по умолчанию добавляет ViewTransformer типа DataTransformerChain для полей DateTimeType. Этот преобразователь вызывается внутри функции normToView класса Form и ожидает аргумент класса \DateTime. Однако, добавив ModelTransformer типа DateTimeToStringTransformer, вы уже изменили нормализованное значение поля myDateTime на строку, и поэтому вы получите ошибку.

Кроме того, ваш код не будет работать, даже если вы используете

->addViewTransformer(new DateTimeToStringTransformer(null, null, 'd/m/Y H:i'));

вместо

->addModelTransformer(new DateTimeToStringTransformer(null, null, 'd/m/Y H:i'));

, потому что в этом случае преобразователь DataTransformerChain вызывается перед добавленным преобразователем, и вы получите ту же ошибку, на этот раз от DateTimeToStringTransformer.

...