Как создать сущность в Drupal 8?
Приветствую. В Drupal 8 практически все построено на механизме Entity или Сущность. В данной статье я расскажу, как создать контентную сущность (Content Entity).
Что это такое? К примеру, единица информации drupal — нода (node), которая используется для создания страниц или таксономия (taxonomy) — все это контентные сущности. По сути это объекты специального класса ContentEntityBase. Для их хранения автоматически в базе данных будет создаваться таблица. У этой таблицы мы можем задавать нужные нам поля. К примеру, у ноды эти поля — заголовок title и body — содержание страницы. Мы можем задать свои поля.
Кроме того сущности могут поддерживать (хотя сейчас мы это опустим) ревизии — механизм отслеживания изменений и строки перевода на другие языки. Также каждому объекту сущности можно подключить поля Drupal, что еще больше расширяет возможности применения сущностей. Имеются специальные интерфейсы для добавления, получения, изменения и удаления объектов сущности (CRUD). Легко можно подключить визуальную админку для CRUD-операций, создать веб-службу для работы с такими операциями, гибко настроить права доступа пользователей для проведения этих операций.
Приступим. Ранее мы уже создали с вами модуль b83. Если вы его установили, вам нужно будет его выключить тут: [site url]/admin/modules/uninstall .
Теперь в директории модуля b83/src/Entity нужно создать файл Example.php :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | <?php namespace Drupal\b83\Entity; use Drupal\Core\Entity\ContentEntityBase; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Entity\EntityTypeInterface; /** * Defines the Example entity. * * @ingroup example * * @ContentEntityType( * id = "example", * label = @Translation("Example"), * base_table = "example", * entity_keys = { * "id" = "id", * "uuid" = "uuid", * }, * ) */ class Example extends ContentEntityBase { public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { $fields = []; // Standard field, used as unique if primary index. $fields['id'] = BaseFieldDefinition::create('integer') ->setLabel(t('ID')) ->setDescription(t('The ID of the Example entity.')) ->setReadOnly(TRUE); // Standard field, unique outside of the scope of the current project. $fields['uuid'] = BaseFieldDefinition::create('uuid') ->setLabel(t('UUID')) ->setDescription(t('The UUID of the Example entity.')) ->setReadOnly(TRUE); // Int field. $fields['cart_content_id'] = BaseFieldDefinition::create('integer') ->setLabel(t('Example int field')) ->setDescription(t('Example int field, a key to cart content record id.')); // Record creation date. $fields['created'] = BaseFieldDefinition::create('created') ->setLabel(t('Created')) ->setDescription(t('The time when an example was created.')); // String field. $fields['order_comment'] = BaseFieldDefinition::create('string') ->setLabel(t('Example string field')) ->setDescription(t('Example string field, a comment to the order.')) ->setSettings(array( 'default_value' => '', 'max_length' => 255, 'text_processing' => 0, )); // Float field. $fields['order_total'] = BaseFieldDefinition::create('decimal') ->setLabel(t('Example float field')) ->setDescription(t('Example float field, an order total sum.')) ->setSettings(array( 'precision' => 20, 'scale' => 2, )); return $fields; } } |
В начале файла обязательно прописываем хендлеры. Далее обязательно прописываем аннотацию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /** * Defines the Example entity. * * @ingroup example * * @ContentEntityType( * id = "example", * label = @Translation("Example"), * base_table = "example", * entity_keys = { * "id" = "id", * "uuid" = "uuid", * }, * ) */ |
Здесь:
- id — идентификатор сущности.
- label — подпись или ярлык для сущности. В данном примере его не будет нигде видно.
- base_table — имя таблицы, которая будет создана для хранения объектов.
- enity_keys : id — номер строки, uuid — уникальный идентификатор объекта сущности. По сути — это первичный и уникальный ключи в таблице.
В методе baseFieldDefinitions(EntityTypeInterface $entity_type)
мы объявляем необходимые нам поля объекта сущности.
Класс мы создали, поля сущности определили. Включаем модуль b83 тут: [site url]/admin/modules .
В итоге после установки модуля в базе данных будет создана пустая таблица со следующей структурой:
Все, теперь мы можем наполнять нашу сущность данными и получать к ним доступ проводя CRUD-операции при помощи интерфейсов Entity. Как это делать я описал в следующей статье. Если было интересно, ставьте звездочки, пишите комментарии. До скорого!