Cảm ơn @Alireza Tabatabaeian vì điều này. Tôi chỉ đăng mã của mình mà tôi đã sử dụng dựa trên câu trả lời đó.
Đối với phân loại mà tôi muốn áp dụng ràng buộc, tôi đã thêm một trường_term_ref_author thực thể tham chiếu đến người dùng.
mymodule.php
function MYMOUDLE_taxonomy_term_presave(TermInterface $term) {
$vocabulary = $term->bundle();
switch ($từ vựng) {
trường hợp 'my_vocab_type':
nếu ($term->isNew()) {
// Đặt tác giả (thông qua trường tùy chỉnh).
$current_user = \Drupal::currentUser()->id();
$term->set('field_term_ref_author', $current_user);
}
nghỉ;
hàm MYMODULE_entity_base_field_info_alter(&$fields, $entity_type) {
if ($entity_type->id() === 'taxonomy_term') {
if (isset($fields['name'])) {
$fields['name']->addConstraint('TermNameUniquePerUser');
}
}
}
mymodule/src/Plugin/Validation/Constraint/TermNameUniquePerUser.php
<?php
không gian tên Drupal\MYMODULE\Plugin\Validation\Constraint;
sử dụng Symfony\Component\Validator\Constraint;
/**
* Kiểm tra xem giá trị đã gửi là duy nhất cho người dùng.
*
* @Hạn chế(
* id = "TermNameUniquePerUser",
* nhãn = @Translation("Tên thuật ngữ duy nhất cho mỗi người dùng", ngữ cảnh = "Xác thực"),
* gõ = "chuỗi"
* )
*/
lớp TermNameUniquePerUser mở rộng Ràng buộc {
// Thông báo sẽ được hiển thị nếu giá trị không phải là duy nhất.
public $notUnique = 'Bạn đã tạo một thuật ngữ có tên %value.';
}
mymodule/src/Plugin/Validation/Constraint/TermNameUniquePerUserValidator.php
<?php
không gian tên Drupal\MYMODULE\Plugin\Validation\Constraint;
sử dụng Symfony\Component\Validator\Constraint;
sử dụng Symfony\Thành phần\Validator\ConstraintValidator;
/**
* Xác thực ràng buộc TermNameUniquePerUser.
*/
lớp TermNameUniquePerUserValidator mở rộng ConstraintValidator {
/**
* {@inheritdoc}
*/
chức năng công khai xác thực($items, Constraint $constraint) {
foreach ($items as $item) {
// Tiếp theo kiểm tra xem giá trị có phải là duy nhất không.
if (!$this->isUnique($item->value)) {
$this->context->addViolation($constraint->notUnique, ['%value' => $item->value]);
}
}
}
/**
* Là duy nhất?
*
* @param chuỗi giá trị $
*/
hàm riêng isUnique($value) {
$uid = \Drupal::currentUser()->id();
$term_name_query = \Drupal::entityQuery('taxonomy_term')
->điều kiện('tên', giá trị $, '=')
->điều kiện('field_term_ref_author', $uid);
// Nếu truy vấn có bất kỳ kết quả nào, thì nó không phải là duy nhất.
// Vì vậy, chúng ta nên trả về điều ngược lại nếu có bất kỳ kết quả nào.
return !($term_name_query->execute());
}
}
Điểm hay khi viết truy vấn thực thể như thế này là nếu từ vựng phân loại không có trường_term_ref_author
trường, sẽ không bao giờ có bất kỳ kết quả nào, do đó, ràng buộc sẽ đánh giá chính xác các thuật ngữ nằm trong các gói không tuân theo ràng buộc (mặc dù điều này sẽ dẫn đến truy vấn cơ sở dữ liệu lãng phí.)