Điểm:0

Làm cách nào tôi có thể đặt quy tắc xác thực trên các trường thực thể của mình và gặp lỗi nếu dữ liệu không hợp lệ

lá cờ ye

Tôi có thực thể này có trường liên kết

Liên kết này là bắt buộc, phải dài hơn 3 ký tự và nhỏ hơn 255 Ngoài ra, nó phải là một URL hợp lệ

lớp Myentity mở rộng ContentEntityBase triển khai BaseEntityInterface {

  sử dụng EntityChangedTrait;

  hàm tĩnh công khai baseFieldDefinitions( EntityTypeInterface $entity_type )
  {
    $fields = parent::baseFieldDefinitions($entity_type);

    $fields['link'] = BaseFieldDefinition::create('string')
      ->setLabel(t('Url'))
      ->setDescription(t('Url thực thể.'))
      -> setSettings(
        [
          'giá_trị_mặc_định' => '',
          'độ dài tối thiểu' => 3,
          'độ dài tối đa' => 255,
          'xử lý văn bản' => 0,
        ]
      ) -> setRequired(true)
      ->addConstraint('Chiều dài', ['tối thiểu' => 3, 'tối đa' => 255]);

  }


}

Và sau đó ở đâu đó trong ứng dụng, tôi muốn lưu thực thể đó

$data = ['liên kết': 'X'];

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

$violationList = $entity->validate();

tiếng vang $violationList->count(); //In ra 0 ! mặc dù chiều dài không tốt!

setRequired(true) đảm bảo với tôi rằng lĩnh vực này liên kết là bắt buộc

addConstraint('Chiều dài', ['tối thiểu' => 3, 'tối đa' => 255]) Có vẻ như không hoạt động, vì tôi không gặp bất kỳ lỗi nào khi xác thực dữ liệu của mình

Vì vậy, tôi có một số câu hỏi về mã này:

  1. Làm cách nào để chúng tôi đặt quy tắc xác thực cho một thực thể, tôi đã thấy hai chức năng thêmConstraintsetPropertyConstraints. cái nào để sử dụng hoặc có một cách khác?

  2. Sau khi xác thực dữ liệu, và nếu $violationList->count() là tích cực, Làm thế nào để chúng tôi có được các quy tắc không thành công, tôi biết $violationList->getFieldNames() trả về trường không hợp lệ nhưng không trả về quy tắc không thành công.

  3. Và cuối cùng, các quy tắc mà Drupal 9 cung cấp là gì, chúng có phải là những quy tắc được cung cấp cùng với các thành phần Trình xác thực Symfony như đã nêu trong tài liệu của Drupal HOẶC có một danh sách xác định.

apaderno avatar
lá cờ us
Trường thực thể *string* chỉ có cài đặt *max_length* và cài đặt đó hoạt động vì nó được sử dụng từ [`Node::baseFieldDefinitions()`](https://api.drupal.org/api/drupal/core%21modules %21node%21src%21Entity%21Node.php/function/Node%3A%3AbaseFieldDefinitions/9.3.x). Không cần thêm ràng buộc cho điều đó, ràng buộc này đã được thêm từ [`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).
Điểm:2
lá cờ ph

Tôi sử dụng addConstraint trong các thực thể tùy chỉnh của mình và không gặp sự cố nào. Tôi thấy định nghĩa trường của bạn là "tên" nhưng dữ liệu của bạn ghi là "liên kết", có lẽ đó là lý do?

Đây là một đoạn trích để nhận lỗi:

    $violations = $entity->validate();
    $errors = [];
    foreach ($vi phạm như $vi phạm) {
      $property = $violation->getPropertyPath();
      $field = phát nổ('.', $property)[0];
      $label = $entity->get($field)->getFieldDefinition()->getLabel();
      $errors[] = $label . ':' . $violation->getMessage();
    }

Có một danh sách các ràng buộc cốt lõi ở đây:

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

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.