Хобрук: Ваш путь к мастерству в программировании

Обратный вызов проверки Symfony – как получить имя свойства при ошибке?

Я настроил свою сущность на обратный вызов жизненного цикла для проверки, имитирующей поля ENUM из mySQL.

Он работает нормально, за исключением того, что при возникновении ошибки он не предоставляет имя свойства и, следовательно, не соответствует формату ошибок, поступающих из Assert.

В приведенном ниже примере первая ошибка исходит от обратного вызова и не содержит информации о свойстве, а остальные генерируются Assert и включают рассматриваемое свойство:

Использованный комплект\адконтроллер

$errors = $this->form_errors->getErrorMessages($form);
        \Doctrine\Common\Util\Debug::dump($errors);

array(3) { [0]=> string(14) "Недействительные двери!" ["powerHp"]=> array(1) { [0]=> string(32) "Это значение должно быть 50 или больше." } ["price"]=> array(1) { [0]=> string(34) "Это значение должно быть 1000 или больше." } }

Я могу знать, откуда возникает ошибка, из-за сообщения, но это также отбрасывает функцию, которая генерирует переменную ошибок для вывода пользователю.

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

ИспользуетсяBundle\Entity\Ad

namespace UsedBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Mapping\ClassMetadata;
/**
 * @ORM\Entity(repositoryClass="UsedBundle\Repository\AdRepository")
 * @ORM\HasLifecycleCallbacks 
 * @ORM\Table(name="ads")
 */
class Ad
{

/**
 * @var integer
 *
 * @ORM\Id
 * @ORM\Column(type="smallint",length=4,unique=true,options={"unsigned":true})
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

......

public static $valid_doors = array(
    '2' => '2',
    '3' => '3',
    '4' => '4',
    '5' => '5',
);

/**
 * @Assert\Callback
 */
public function validate(ExecutionContextInterface $context, $payload)
{
    if (!in_array($this->getdoors(), self::$valid_doors)) {
        $context->buildViolation('Invalid doors!')
            ->atPath('doors')
            ->addViolation();
    }
}
}

Ответы:


1

В вашем случае (конечно, если ваша версия Symfony не старше 2.4) я могу предложить использовать функцию статической проверки. Когда вы используете статическую функцию, вы должны передать $object!

/**
 * @static validate
 *
 * @param $object 
 * @param ExecutionContextInterface $context
 */
public static function validate($object, ExecutionContextInterface $context)
{
    if (!in_array($object->getdoors(), self::$valid_doors)) {
        $context->buildViolation('Invalid doors!')
            ->atPath('doors')
            ->addViolation();
    }
}

Как видите - аннотации /** @Assert\Callback */ нет! Кроме того, не нужно писать аннотацию класса @ORM\HasLifecycleCallbacks. Надеюсь, поможет!

Также — это ссылка на официальную документацию Symfony

01.11.2017
  • Спасибо @staskrak. Мне не удалось заставить это работать. Не уверен, как передать параметр $object. Возможно, это так. Кстати, я использую версию 3.2. Я знал о связанных документах, но они не решают проблему имени свойства. 01.11.2017
  • @BernardA -›atPath('doors') - это свойство, с которым будет связана ошибка. Если у вас есть встроенная форма ->, вам нужно использовать Assert\Valid(). в аннотации. 01.11.2017
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..