Спасибо @Alireza Tabatabaeian за это. Я просто публикую свой код, который использовал на основе этого ответа.
К таксономии, к которой я хотел применить ограничение, я добавил field_term_ref_author ссылка сущности на пользователя.
моймодуль.php
функция MYMOUDLE_taxonomy_term_presave(TermInterface $term) {
$словарь = $term->bundle();
переключатель ($словарь) {
случай 'my_vocab_type':
если ($term->isNew()) {
// Установить автора (через настраиваемое поле).
$current_user = \Drupal::currentUser()->id();
$term->set('field_term_ref_author', $current_user);
}
сломать;
функция MYMODULE_entity_base_field_info_alter(&$fields, $entity_type) {
если ($entity_type->id() === 'taxonomy_term') {
если (isset($fields['имя'])) {
$fields['name']->addConstraint('TermNameUniquePerUser');
}
}
}
mymodule/src/Plugin/Validation/Constraint/TermNameUniquePerUser.php
<?php
пространство имен Drupal\MYMODULE\Plugin\Validation\Constraint;
используйте Symfony\Component\Validator\Constraint;
/**
* Проверяет уникальность отправленного значения для пользователя.
*
* @Ограничение(
* id = "TermNameUniquePerUser",
* label = @Translation("Имя термина уникально для каждого пользователя", context = "Проверка"),
* тип = "строка"
* )
*/
класс TermNameUniquePerUser расширяет ограничение {
// Сообщение, которое будет показано, если значение не уникально.
public $notUnique = 'Вы уже создали термин с именем %value.';
}
mymodule/src/Plugin/Validation/Constraint/TermNameUniquePerUserValidator.php
<?php
пространство имен Drupal\MYMODULE\Plugin\Validation\Constraint;
используйте Symfony\Component\Validator\Constraint;
используйте Symfony\Component\Validator\ConstraintValidator;
/**
* Проверяет ограничение TermNameUniquePerUser.
*/
класс TermNameUniquePerUserValidator расширяет ConstraintValidator {
/**
* {@inheritdoc}
*/
общедоступная функция проверки ($ элементы, ограничение $ ограничение) {
foreach ($items as $item) {
// Далее проверяем уникальность значения.
если (!$this->isUnique($item->value)) {
$this->context->addViolation($constraint->notUnique, ['%value' => $item->value]);
}
}
}
/**
* Является уникальным?
*
* @param строка $значение
*/
частная функция isUnique($value) {
$uid = \Drupal::currentUser()->id();
$term_name_query = \Drupal::entityQuery('taxonomy_term')
->условие('имя', $значение, '=')
->условие('field_term_ref_author', $uid);
// Если запрос имеет какие-либо результаты, то он не уникален.
// Таким образом, мы должны вернуть противоположное тому, есть ли какие-либо результаты.
вернуть !($term_name_query->выполнить());
}
}
Преимущество такого написания запроса сущностей состоит в том, что если словарь таксономии не имеет field_term_ref_author
поле, никогда не будет никаких результатов, поэтому ограничение будет правильно оцениваться с терминами, которые находятся в пакетах, не подпадающих под ограничение (хотя это приведет к напрасному запросу к базе данных).