如何在Drupal 8中创建自定义实体


10

我在Drupal 7上构建了一个大型个人项目,该项目具有许多自定义实体。我想开始将项目升级到Drupal 8,但是完全重写过的Drupal 8内核对我来说太大了,以至于我不了解任何文档(+ Symfony完全不为我所知,我只是一个仅Drupal的简单家伙) 。

我试图仅通过查看一些核心模块代码来创建自定义实体,但没有成功。

您能否指出我一些有关Drupal 8中的自定义实体的文章(我找不到一个),或者给我一些基本的逐步指南?

谢谢。

entities  8 

1
您是否可以编辑问题,以补充一下您所学的范围以及您所处的困境?看到有问题的特定代码将是理想的。建立自定义实体不是一件容易的事-对于网站格式和您获得良好答案的机会来说,这可能是一个太大的问题。请记住,正是出于这个原因,对链接/教程的请求在这里特别不合主题。最好逐个分解,并询问有关这些小片段的问题。谢谢
克莱夫(Clive)

顺便说一句,如果您不了解任何Symfony,您可能会发现很难将D7知识应用于D8。事情已经发生了相当大的变化(我确定您已经知道)。我强烈建议您在开始旅程之前,尽可能多地阅读Symfony书籍;有那种接地将使过渡很多光滑的,相信我。另外,我发现核心Contact模块中的Category和Message实体是学习的很好起点
Clive

@Clive除了验证API之外,Drupal 8中的Entity API几乎与Symfony无关,因此我认为这无关紧要。否则,我同意这个问题的范围太广,但是我尝试给出一个概述,然后可以更详细地回答更具体的问题。有了一个起点,就可以了,因为如果您不了解D8,那并不太明显。
Berdir

@Berdir我通常是指D7-> D8,而不是专门针对实体。例如,了解Symfony路由和服务会使总体上更容易理解核心代码。顺便说一句,写得很好,甚至没有理由立即考虑解决这个问题IMO,这是一种宝贵的资源(即使从广泛的角度来说也是一点点)
克莱夫(Clive)

Answers:


13

我在这里处理Entity API文档:https : //drupal.org/developing/api/entity

这个问题太大了,无法详细回答,这取决于您是否需要内容或配置实体。假设您想要内容实体(存储在数据库中,可以在字段中/可修改/ ...,上面链接中的详细信息),则需要执行类似的操作,上面链接的文档现在将最终涵盖每个步骤,包括教程,现在,仅涵盖了第一步。

  1. 提供一个实体类并添加必要的注释以将其公开为实体。
  2. 提供必要的表,如果您已经拥有7.x模式,则不必进行太多更改,但是如果您的实体可以具有某种语言/可以翻译,则希望添加一个uuid或可能的langcode列。如果要使某些基本字段(属性)可翻译或可修订,请参见步骤中链接的节点示例,当前您需要自己提供必要的表。
  3. 在baseFieldDefinitions()方法中提供基本字段定义。。请注意,此工作方式将在https://drupal.org/node/2047229中更改(从数组到类)。
  4. 如果您有需要发生的自定义逻辑(例如,在保存实体之前(例如更新更改的时间戳)),请实施必要的pre / post Save / load / Delete方法。
  5. 如果您具有非平凡的访问逻辑,则实现访问控制器,并覆盖checkAccess()和checkCreateAccess()方法,或者如果您仅具有允许完全访问的单个权限,则在注释中指定admin_permission。
  6. 建议,尽管从技术上讲不是必需的,但要为您的实体类提供一个接口(例如Node的NodeInterface),该接口包括用于基础字段的有用(通常为get / set / isSomething())方法,以便您可以在该接口上键入提示,并自动完成这些方法。

根据您的需要,还会有进一步的步骤,例如定义必要的表单,可能的渲染控制器等,但是如果您需要更多信息,则这些问题可能应该是单独的问题。

笔记:

  • 配置实体基本相似,除了您需要使用配置存储控制器(https://drupal.org/node/2119905将使它更容易),您不需要(显然)需要定义表模式,但是您需要提供配置模式文件,例如参见分类词汇或节点类型。
  • 内容实体没有将其基本字段定义为公共或受保护的属性,而是在值和字段属性中对其进行自动管理。通过get()/ set()或相应的magic方法访问它们。($ node-> title等于$ node-> get('title'))。
  • 关于文档的帮助将非常欢迎。我已经为我想要的内容/结构创建了一个基本的大纲,因此只需创建一个新页面并开始使用,例如,我也对简化教程感兴趣,对于配置实体,这里已经有一个准备就绪后将移至实体文档:https : //drupal.org/node/1809494
  • Core拥有大量的内容实体实现,如果您想查看工作示例:Node,User,Term,Comment,CustomBlock等,如步骤1中链接的文章所述,您总是可以找到实体名称空间中的模块。
  • @fago 这个周末刚刚在维也纳DrupalCamp上发表了有关Entity API的演讲,涵盖了我在这里写的很多内容以及更多内容。

1
Drupal的代码生成器是非常有用的- >> github.com/Chi-teck/drupal-code-generator
雷米

1
drupalconsole.com-也是一个好帮手(生成样板代码,与Drupal进行交互和调试的工具。)
milkovsky
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.