Как настроить сообщение об ошибке DataTransformer в Symfony?

Мой простой преобразователь данных преобразует число в сущность и наоборот. Это похоже на пример из официальной документации.

Метод reverseTransform преобразует число в сущность, а в случае неудачи выдает TransformationFailedException с описательным сообщением:

public function reverseTransform($number)
{
    if (!$number) {
        return null;
    }

    $issue = $this->om
        ->getRepository('AcmeTaskBundle:Issue')
        ->findOneBy(array('number' => $number))
    ;

    if (null === $issue) {
        throw new TransformationFailedException(sprintf(
            'An issue with number "%s" does not exist!',
            $number
        ));
    }

    return $issue;
}

Однако поле формы, использующее приведенный выше преобразователь, получает общее сообщение об ошибке «Это значение недопустимо». Даже изменение текста исключения (которое, как я ожидаю, будет использоваться в качестве сообщения проверки, но это не так...) не меняет сообщение об ошибке.

Как я могу отобразить текст исключения вместо «Это значение недействительно»?


person gremo    schedule 03.11.2013    source источник


Ответы (1)


Ни в коем случае, потому что symfony ловит это исключение и устанавливает собственное сообщение (поле некорректно). Если вы хотите настроить это сообщение, вы должны установить валидатор в это поле.

Может я ошибаюсь, но ничего не нашел.

Например:

public function reverseTransform($number)
{
    if (!$number) {
        return null;
    }

    $issue = $this->om
        ->getRepository('AcmeTaskBundle:Issue')
        ->findOneBy(array('number' => $number))
    ;

    if (null === $issue) {
        // Nothig action
        //throw new TransformationFailedException(sprintf(
        //    'An issue with number "%s" does not exist!',
        //    $number
        //));
    }

    return $issue;
}

И добавьте в поле валидатор NotBlank/NotNull.

UPD

И вы можете установить параметр «invalid_message» в типе формы.

Например:

$builder
  ->add('you_field', 'text', array('invalid_message' => 'An issue number not found'))
  ->get('you_field')->addModelTransformer('....');
person ZhukV    schedule 03.11.2013
comment
Во-первых, спасибо. Ваш метод должен работать и, по крайней мере, обеспечивать хорошие отзывы пользователей о том, что происходит. Может быть, есть стандартный способ сделать это, я найду лучший способ (если есть) или приму ваш ответ. - person gremo; 03.11.2013
comment
Я не могу найти других методов для настройки этого сообщения, но только форма symfony ловит это исключение, а не события для управления. github.com/symfony/Form/blob/master/Form.php# L612 Итак, в качестве решения вы можете использовать POST_SUBMIT и управлять синхронизированным свойством, но я не пробовал - person ZhukV; 04.11.2013
comment
Исключение предназначено только для отладки, а не для раскрытия, предоставленный ответ - это путь. В противном случае следует использовать один из слушателей отправки и использовать $form->addError(new FormError('my message')) в соответствующем поле с правильным сообщением. Это в любом случае приведет к тому, что корень будет недействительным с хорошим отображением и хорошим сообщением. - person Heah; 16.11.2016