Рейтинг:0

Как я могу установить правила проверки для полей моей сущности и получить ошибки, если данные недействительны

флаг ye

У меня есть этот объект, который получил поле ссылки

Эта ссылка обязательна, должна содержать более 3 символов и менее 255 символов. Также это должен быть действительный URL

класс Myentity расширяет ContentEntityBase, реализует BaseEntityInterface {

  использовать EntityChangedTrait;

  общедоступная статическая функция baseFieldDefinitions (EntityTypeInterface $entity_type)
  {
    $fields = parent::baseFieldDefinitions($entity_type);

    $fields['ссылка'] = BaseFieldDefinition::create('строка')
      ->setLabel(t('URL'))
      ->setDescription(t('URL объекта.'))
      -> установить настройки (
        [
          'значение_по умолчанию' => '',
          'мин_длина' => 3,
          'max_length' => 255,
          'текстовая_обработка' => 0,
        ]
      )->setRequired(истина)
      ->addConstraint('Длина', ['min' => 3, 'max' => 255]);

  }


}

А потом где-то в приложении я хочу сохранить эту сущность

$data = ['ссылка': 'X'];

$entity = Myentity::create($data);

$violationList = $entity->validate();

эхо $violationList->count(); // Печатает 0! хотя длина не очень!

setRequired (истина) гарантирует мне, что поле соединять является обязательным

addConstraint('Длина', ['минимум' => 3, 'максимум' => 255]) Кажется, не работает, так как я не получил никаких ошибок при проверке моих данных

Итак, у меня есть несколько вопросов об этом коде:

  1. Как мы устанавливаем правила проверки для сущности, я видел две функции добавить ограничение и setPropertyConstraints. какой использовать или есть другой способ?

  2. После проверки данных, и если $нарушениеСписок->количество() является положительным, как мы получаем правила, которые не сработали, я знаю $violationList->getFieldNames() возвращает недопустимое поле, но не правило, которое не удалось.

  3. И, наконец, какие правила предоставляет Drupal 9, поставляются ли они с компонентами Symfony Validator, как указано в документации Drupal, ИЛИ существует определенный список.

apaderno avatar
флаг us
Поле сущности *string* имеет только настройку *max_length*, и это работает, так как используется из [`Node::baseFieldDefinitions()`](https://api.drupal.org/api/drupal/core%21modules %21node%21src%21Entity%21Node.php/function/Node%3A%3AbaseFieldDefinitions/9.3.x). Для этого нет необходимости добавлять ограничение, которое уже добавлено из [`StringItem::getConstraints`](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Field%21Plugin %21Field%21FieldType%21StringItem.php/function/StringItem%3A%3AgetConstraints/9.3.x).
Рейтинг:2
флаг ph

Я использую addConstraint в своих пользовательских объектах, и у меня не было проблем. Я вижу, что ваше определение поля предназначено для «имени», но ваши данные говорят «ссылка», может быть, поэтому?

Вот фрагмент для получения ошибок:

    $нарушения = $entity->validate();
    $ ошибки = [];
    foreach ($ нарушения как $ нарушения) {
      $property = $нарушение->getPropertyPath();
      $field = взорвать('.', $property)[0];
      $label = $entity->get($field)->getFieldDefinition()->getLabel();
      $ошибки[] = $метка. ':' . $нарушение->getMessage();
    }

Вот список основных ограничений:

https://api.drupal.org/api/drupal/vendor!symfony!validator!ConstraintValidator.php/class/uses/ConstraintValidator/9.3.x

Ответить или комментировать

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