在Drupal 8中以编程方式创建自定义实体类型

在Drupal 8中以编程方式创建自定义实体类型,drupal,types,entity,drupal-8,Drupal,Types,Entity,Drupal 8,我一直在努力在Drupal 8.2.x中以编程方式创建自定义实体类型。实体类型应该是可翻译和可修改的 创建默认配置()并不能解决问题,因为它不允许使用其处理程序定义类 在尝试一本书中的示例时(Matt Glaman的Drupal 8 Development Cookbook,2016,第章创建内容实体类型),启用模块后出现错误: 致命错误:Drupal\mymodule\Entity\Message::baseFieldDefinitions(Drupal\mymodule\Entity\Ent

我一直在努力在Drupal 8.2.x中以编程方式创建自定义实体类型。实体类型应该是可翻译和可修改的

创建默认配置()并不能解决问题,因为它不允许使用其处理程序定义类

在尝试一本书中的示例时(Matt Glaman的Drupal 8 Development Cookbook,2016,第章创建内容实体类型),启用模块后出现错误:

致命错误:Drupal\mymodule\Entity\Message::baseFieldDefinitions(Drupal\mymodule\Entity\EntityTypeInterface$Entity\U类型)的声明必须与Drupal\Core\Entity\FieldableEntityInterface::baseFieldDefinitions(Drupal\Core\Entity\EntityTypeInterface$Entity\U类型)兼容在第45行的/srv/www/vhosts/test/modules/custom/mymodule/src/Entity/Message.php中

书中的代码似乎已经过时了。所以我想知道是什么让代码不兼容。如果有人能帮我,请

类的定义和声明如下

/**
* @file Contains \Drupal\mymodule\Entity\Message
*/
namespace Drupal\mymodule\Entity;
use Drupal\Core\Entity\ContentEntityBase;

/**
* Defines the profile entity class.
*
* @ContentEntityType(
*   id = "message",
*   label = @Translation("Message"),
*   handlers = {
*     "list_builder" = "Drupal\mymodule\MessageListBuilder",
*     "form" = {
*       "default" = "Drupal\Core\Entity\ContentEntityForm",
*       "add" = "Drupal\Core\Entity\ContentEntityForm",
*       "edit" = "Drupal\Core\Entity\ContentEntityForm",
*       "delete" = "Drupal\Core\Entity\ContentEntityDeleteForm",
*     },
*     "route_provider" = {
*       "html" = "Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider",
*     },
*   },
*   base_table = "message",
*   fieldable = TRUE,
*   entity_keys = {
*     "id" = "message_id",
*     "label" = "title",
*     "langcode" = "langcode",
*     "uuid" = "uuid"
*   },
*   links = {
*     "canonical" = "/messages/{message}",
*     "edit-form" = "/messages/{message}/edit",
*     "delete-form" = "/messages/{message}/delete",
*     "collection" = "/admin/content/messages"
*   },
*  )
*/

/**
* {@inheritdoc}
*/
public static function baseFieldDefinitions(EntityTypeInterface entity_type) {
    $fields['message_id'] = BaseFieldDefinition::create('integer')
        ->setLabel(t('Message ID'))
        ->setDescription(t('The message ID.'))
        ->setReadOnly(TRUE)
        ->setSetting('unsigned', TRUE);
    $fields['langcode'] = BaseFieldDefinition::create('language')
        ->setLabel(t('Language code'))
        ->setDescription(t('The message language code.'))
        ->setRevisionable(TRUE);
    $fields['uuid'] = BaseFieldDefinition::create('uuid')
        ->setLabel(t('UUID'))
        ->setDescription(t('The message UUID.'))
        ->setReadOnly(TRUE);
    $fields['title'] = BaseFieldDefinition::create('string')
        ->setLabel(t('Title'))
        ->setRequired(TRUE)
        ->setTranslatable(TRUE)
        ->setRevisionable(TRUE)
        ->setSetting('max_length', 255)
        ->setDisplayOptions('view', array(
            'label' => 'hidden',
            'type' => 'string',
            'weight' => -5,
        ))
        ->setDisplayOptions('form', array(
            'type' => 'string_textfield',
            'weight' => -5,
        ))
        ->setDisplayConfigurable('form', TRUE);
    $fields['content'] = BaseFieldDefinition::create('text_long')
        ->setLabel(t('Content'))
        ->setDescription(t('Content of the message'))
        ->setTranslatable(TRUE)
        ->setDisplayOptions('view', array(
            'label' => 'hidden',
            'type' => 'text_default',
            'weight' => 0,
        ))
        ->setDisplayConfigurable('view', TRUE)
        ->setDisplayOptions('form', array(
            'type' => 'text_textfield',
            'weight' => 0,
        ))
        ->setDisplayConfigurable('form', TRUE);
    return $fields;
}

我是这里的作者,很抱歉。我认为勘误表已经更新了。但这里有一个解决办法

原因似乎是未导入
EntityTypeInterface
。尝试添加
使用Drupal\Core\Entity\EntityTypeInterface到代码的开头

<?php
/**
 * @file Contains \Drupal\mymodule\Entity\Message
 */

namespace Drupal\mymodule\Entity;

use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;

您忘记了类定义,如:

class MyEntity extends ContentEntityBase {}